这道题 最需要主意:将询问的最大值进行存储。每次进行更新的时候最大值也要更新。
由于一个细节没有处理好 还是wa了几次。
下面附上代码:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define N 200005 int a[N]; int max(int x,int y) { if(x>y)return x; else return y; } struct node { int l; int r; int ma; }t[N*4]; void make (int sl,int sr,int i) { t[i].l=sl; t[i].r=sr; if(sl==sr) t[i].ma=a[sr]; else { int mid=(t[i].l+t[i].r)/2; make (sl,mid,i*2); make (mid+1,sr,i*2+1); t[i].ma=max(t[i*2].ma,t[i*2+1].ma); } } void update(int x,int val ,int i) { if(t[i].l==x&&t[i].r==x) { t[i].ma=val; return ; } else if(t[i].l<t[i].r) { int mid=(t[i].l+t[i].r)/2; if(x>mid) update(x,val,i*2+1); else update(x,val,i*2); t[i].ma=max(t[i*2].ma,t[i*2+1].ma); } } int query(int st,int ed,int i) { if(st==t[i].l&&ed==t[i].r) return t[i].ma; else if(t[i].l<t[i].r) { int mid=(t[i].l+t[i].r)/2; if(st>mid) return query(st,ed,i*2+1); else if(ed<=mid) return query(st,ed,i*2); else { return max(query(st,mid,i*2), query(mid+1,ed,i*2+1)); } } } int main() { int n,m; int i; char str[3]; int start,end; int x,val; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); make(1,n,1); while(m--) { scanf("%s",str); if(strcmp(str,"Q")==0) { scanf("%d %d",&start,&end); printf("%d\n",query(start,end,1)); } if(strcmp(str,"U")==0) { scanf("%d %d",&x,&val); update(x,val,1); } } } return 0; }