http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=221#problem/C
#include <stdio.h> #include<string.h> struct Node { int sum; int l,r; } node[800001]; int num[200001]; int max; int max1(int x,int y) { return x>y?x:y; } void build(int rt,int ll,int rr) { if(ll==rr) { node[rt].l=node[rt].r=ll; node[rt].sum=num[ll]; return; } node[rt].l=ll; node[rt].r=rr; int mid=(ll+rr)/2; build(rt*2,ll,mid); build(rt*2+1,mid+1,rr); node[rt].sum=max1(node[rt*2].sum,node[rt*2+1].sum); } void query(int rt,int s,int e) { int mid; if(node[rt].l==s&&node[rt].r==e) { if(node[rt].sum>max) max = node[rt].sum; return ; } mid=(node[rt].l+node[rt].r)/2; if(s>mid) query(rt*2+1,s,e); else if(e<=mid) query(rt*2,s,e); else { query(rt*2,s,mid); query(rt*2+1,mid+1,e); } } void update(int rt,int pos,int v) { if(node[rt].l==pos&&node[rt].r==pos) { node[rt].sum = v; return; } int mid; mid=(node[rt].l+node[rt].r)/2; if(pos<=mid) { update(rt*2,pos,v); } else { update(rt*2+1,pos,v); } node[rt].sum=max1(node[rt*2].sum,node[rt*2+1].sum); } int main() { int i; int n,m; char ch[10]; int x,y; while(scanf("%d%d",&n,&m)!=EOF) { for(i = 1; i<=n; i++) { scanf("%d\n",&num[i]); } build(1,1,n); for(i = 1; i<=m; i++) { scanf("%s%d%d",ch,&x,&y); if(ch[0] == 'Q') { max = 0; query(1,x,y); printf("%d\n",max); } if(ch[0] == 'U') update(1,x,y); } } return 0; }
线段树问题,二分思想。