题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
思路:简单的线段树问题
#include<iostream> #include<cstdio> using namespace std; const int N=200010; struct node { int l,r; int max; }line[4*N]; int num[N]; int Maxn(int a,int b) { return a>b?a:b; } void create(int k,int x,int y) { int mid; line[k].l=x; line[k].r=y; if(x==y) { line[k].max=num[x]; return; } mid=(x+y)>>1; create(k<<1,x,mid); create(k<<1|1,mid+1,y); line[k].max=Maxn(line[k<<1].max,line[k<<1|1].max); } void my_insert(int k,int x,int pos) { int mid; if(line[k].l==x&&line[k].r==x) { line[k].max=pos; return; } mid=(line[k].l+line[k].r)>>1; if(x<=mid) my_insert(k<<1,x,pos); else my_insert(k<<1|1,x,pos); line[k].max=Maxn(line[k<<1].max,line[k<<1|1].max); } int visit(int k,int x,int y) { int mid; if(line[k].l==x&&line[k].r==y) return line[k].max; mid=(line[k].l+line[k].r)>>1; if(x>mid) return visit(k<<1|1,x,y); else if(y<=mid) return visit(k<<1,x,y); else return Maxn(visit(k<<1,x,mid),visit(k<<1|1,mid+1,y)); } int main() { int n,m,i,a,b; char ch[5]; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&num[i]); create(1,1,n); for(i=1;i<=m;i++) { scanf("%s %d %d",&ch,&a,&b); if(ch[0]=='Q') { printf("%d\n",visit(1,a,b)); } if(ch[0]=='U') { num[a]=b; my_insert(1,a,b); } } } return 0; }