和 hdu1166敌兵布阵差不多 但是查询区间最大值时要注意 查询的是[l,r]个区间,但是在【t[n*2],t[n*2+1]】这个区间内,而且可能比这个区间小,不能再取这个区间的最大值 代码: #include<iostream> using namespace std; const int MAX=200005; int n,m,maxx,aa[MAX]; struct node { int left,right,ma; }t[MAX*10]; void build(int l,int r,int n) { t[n].left=l; t[n].right=r; if(l==r) { t[n].ma=aa[l]; return ; } int mid=(l+r)>>1; build(l,mid,n*2); build(mid+1,r,n*2+1); t[n].ma=max(t[n*2].ma,t[n*2+1].ma); } void query(int l,int r,int n) { if(t[n].left==l&&t[n].right==r) { maxx=max(maxx,t[n].ma); return; } int mid=(t[n].left+t[n].right)>>1; if(mid>=r) query(l,r,n*2); else if(mid<l) query(l,r,n*2+1); else { query(l,mid,n*2); query(mid+1,r,n*2+1); } //maxx=max(t[n*2].ma,t[n*2+1].ma); t[n*2],t[n*2+1]表示的区间可能比[l,r]大 } void update(int l,int r,int n,int goal,int x) { if(t[n].left==goal&&t[n].right==goal) { t[n].ma=x; return; } int mid=(t[n].left+t[n].right)>>1; if(mid>=r) update(l,r,n*2,goal,x); else if(mid<l) update(l,r,n*2+1,goal,x); else { update(l,mid,n*2,goal,x); update(mid+1,r,n*2+1,goal,x); } t[n].ma=max(t[n*2].ma,t[n*2+1].ma); } int main() { int i,a,b; char s[5]; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&aa[i]); build(1,n,1); while(m--) { scanf("%s",&s); if(s[0]=='Q') { scanf("%d%d",&a,&b); maxx=-1; query(a,b,1); printf("%d/n",maxx); } else { scanf("%d%d",&a,&b); update(a,a,1,a,b); } } } return 0; }