题意:略
思路:套hdu1166模版改改就行了,要注意的是,网上有的代码是错的,还贴出来...
#include <iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 200100 int n,ans; struct{ int l,r,value,max; }tree[MAXN<<2]; void Build(int l,int r,int id){ tree[id].l=l; tree[id].r=r; tree[id].max=-1; if(l!=r){ int mid=(l+r)>>1; Build(l,mid,id<<1); Build(mid+1,r,id<<1|1); } } void update(int l,int value,int id){ if(tree[id].l==tree[id].r&&tree[id].l==l){ tree[id].max=value; return; } int mid=(tree[id].l+tree[id].r)>>1; if(l<=mid) update(l,value,id<<1); else update(l,value,id<<1|1); tree[id].max=max(tree[id<<1|1].max,tree[id<<1].max); } void query(int l,int r,int id){ if(tree[id].l==l&&tree[id].r==r){ ans=max(ans,tree[id].max); return; } int mid=(tree[id].l+tree[id].r)>>1; if(r<=mid) return query(l,r,id<<1); else if(l>mid) return query(l,r,id<<1|1); else{ query(l,mid,id<<1); query(mid+1,r,id<<1|1); } } int main(int argc, char** argv) { int t,x,y,n,i,value,m; char str[5]; while(scanf("%d%d",&n,&m)!=EOF){ Build(1,n,1); for(i=1;i<=n;i++){ scanf("%d",&value); update(i,value,1); } for(i=0;i<m;i++){ scanf("%s %d%d",str,&x,&y); if(str[0]=='U')update(x,y,1); else{ ans=0; query(x,y,1); printf("%d\n",ans); } } } return 0; }