1
3
题意:中问题,题意自看
思路:明显线段树,这里是查询一个区间里最值靠左的位置,直接记录一下区间最值和位置即可,放在线段树里面更新即可。
AC代码:#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int nn = 100005;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int A[nn];
struct node{
int l,r;
int pos,ms;
}Tree[nn<<2];
//void Push_Up(int rt)
//{
// Tree[rt].ms = max(Tree[rt<<1].ms,Tree[rt<<1|1].ms);
// if(Tree[rt].ms==Tree[rt<<1].ms)
// {
// Tree[rt].pos = Tree[rt<<1].pos;
// }
// else
// {
// Tree[rt].pos = Tree[rt<<1|1].pos;
// }
//}
void Push_Up(node &fa,node &ls,node &rs)
{
fa.l=ls.l,fa.r=rs.r;
fa.ms=max(ls.ms,rs.ms);
if(fa.ms==ls.ms)
{
fa.pos=ls.pos;
return ;
}
fa.pos=rs.pos;
}
void Build(int l,int r,int rt)
{
Tree[rt].l=l,Tree[rt].r=r;
if(l==r)
{
Tree[rt].ms = A[l];
Tree[rt].pos = l;
return ;
}
int m = (l+r)>>1;
Build(lson);
Build(rson);
Push_Up(Tree[rt],Tree[rt<<1],Tree[rt<<1|1]);
}
void Update(int pos,int val,int rt)
{
if(Tree[rt].l==Tree[rt].r)
{
Tree[rt].ms = val;
return ;
}
int m =(Tree[rt].l+Tree[rt].r)>>1;
if(pos<=m)
Update(pos,val,rt<<1);
else
Update(pos,val,rt<<1|1);
Push_Up(Tree[rt],Tree[rt<<1],Tree[rt<<1|1]);
}
//int query_ans(int l,int r,int rt)
//{
// if(l<=Tree[rt].l&&Tree[rt].r<=r)
// {
// return Tree[rt].pos;
// }
// int t=0;
// int m =(Tree[rt].l+Tree[rt].r)>>1;
// node tmp[3];
// if(l<=m) tmp[1].pos = query_ans(l,r,rt<<1),t++;
// if(m<r) tmp[2].pos = query_ans(l,r,rt<<1|1),t+=2;
// if(t<3)return tmp[t].pos;
// Push_Up(tmp[0],tmp[1],tmp[2]);
// return tmp[0].pos;
//}
node query(int id,int l,int r)
{
if(l<=Tree[id].l&&Tree[id].r<=r)
return Tree[id];
int mid=(Tree[id].l+Tree[id].r)>>1;
node tmp[3];
int t=0;
if(mid>=l)
tmp[1]=query(id<<1,l,r),t++;
if(mid<r)
tmp[2]=query(id<<1|1,l,r),t+=2;
if(t<3)
return tmp[t];
Push_Up(tmp[0],tmp[1],tmp[2]);
return tmp[0];
}
int main()
{
int tt,n,q;
int op,a,b;
scanf("%d",&tt);
while(tt--)
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
Build(1,n,1);
while(q--)
{
scanf("%d%d%d",&op,&a,&b);
if(op==1)
{
node ans=query(1,a,b);
printf("%d\n",ans.pos);
}
else
Update(a,b,1);
}
}
return 0;
}