hdu 1754 I Hate It(基础线段树)
#include <stdio.h>
#define MAXSIZE 200001
int stu[MAXSIZE];
struct seg_tree
{
int l,r,max;
};
seg_tree tree[MAXSIZE*3];
inline int Max(int a,int b)
{
return a>b?a:b;
}
void build(int a,int b,int idx)
{
tree[idx].l=a;
tree[idx].r=b;
if(a==b)
{
tree[idx].max=stu[a];
return;
}
int mid=(a+b)/2;
build(a,mid,idx*2);
build(mid+1,b,idx*2+1);
tree[idx].max=Max(tree[idx*2].max,tree[idx*2+1].max);
}
void update(int i,int val,int idx)
{
if(i==tree[idx].l && tree[idx].r==i)
{
tree[idx].max=val;
return;
}
if(i<=tree[idx*2].r) update(i,val,idx*2);
else update(i,val,idx*2+1);
tree[idx].max=Max(tree[idx*2].max,tree[idx*2+1].max);
}
int query(int a,int b,int idx)
{
if(a<=tree[idx].l && tree[idx].r<=b)
{
return tree[idx].max;
}
if(b<=tree[idx*2].r) return query(a,b,idx*2);
else if(a>=tree[idx*2+1].l) return query(a,b,idx*2+1);
else return Max(query(a,tree[idx*2].r,idx*2),query(tree[idx*2+1].l,b,idx*2+1));
}
int main()
{
int N,M;
while(scanf("%d%d",&N,&M)!=EOF)
{
int i,j;
char ch;
for(i=1; i<=N; i++)
scanf("%d",&stu[i]);
build(1,N,1);
while(M--)
{
getchar();
scanf("%c %d %d",&ch,&i,&j);
if(ch=='Q')
{
printf("%d\n",query(i,j,1));
}
else update(i,j,1);
}
}
return 0;
}
浙公网安备 33010602011771号