http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include<iostream> using namespace std; struct { int l,r,max; }s[200005*4]; int data[200005]; void build(int l,int r,int n) { int mid=(l+r)/2; if(l==r) { s[n].l=l; s[n].r=r; s[n].max=data[l]; } else { s[n].l=l; s[n].r=r; build(l,mid,n*2); build(mid+1,r,n*2+1); s[n].max=s[n*2].max>=s[n*2+1].max?s[n*2].max:s[n*2+1].max; } } int _max(int l,int r,int n) { int mid=(s[n].l+s[n].r)/2; if(s[n].l==l&&s[n].r==r) { return s[n].max; } else if(r<=mid) _max(l,r,n*2); else if(l>mid) _max(l,r,n*2+1); else { int a,b; a=_max(l,mid,n*2); b=_max(mid+1,r,n*2+1); if(a>=b) return a; else return b; } } void updata(int i,int j,int n) { int mid=(s[n].l+s[n].r)/2; if(s[n].l==i&&s[n].r==i) { s[n].max=j; int count=n/2; while(count>=1) { int a=s[count*2].max; int b=s[count*2+1].max; s[count].max=a>=b?a:b; count/=2; } } else if(i<=mid) updata(i,j,n*2); else if(i>mid) updata(i,j,n*2+1); } int main() { int n,m; while(scanf("%d%d",&n,&m)>0) { for(int i=1;i<=n;i++) scanf("%d",&data[i]); getchar(); build(1,n,1); char c; while(m--) { scanf("%c",&c); if(c=='Q') { int x,y; scanf("%d%d",&x,&y); printf("%d\n",_max(x,y,1)); } else if(c=='U') { int x,y; scanf("%d%d",&x,&y); updata(x,y,1); } getchar(); } } return 0; }