一节课。。。
#include#include #include #include #include #define MAXN 200000 using namespace std;int a0[MAXN+5],st[MAXN*4+5]; //四倍void build(int o,int l,int r){ if(l==r) st[o]=a0[l]; else { int m=l+((r-l)>>1); build((o<<1),l,m); build((o<<1)|1,m+1,r); st[o]=max(st[o<<1],st[(o<<1)|1]); }}void exch(int o,int l,int r,int ind,int ans){ if(l==r) { st[o]=ans; return; } else { int m=l+((r-l)>>1); if(ind<=m) { exch((o<<1),l,m,ind,ans);//|1相当于+1 } else { exch((o<<1)|1,m+1,r,ind,ans); } } st[o]=max(st[o<<1],st[(o<<1)|1]);//第二次写时,忘记这步 :-(}int sear(int o,int l,int r,int ql,int qr){ if(qr r)return 0; if(qr>=r&&ql<=l)return st[o]; int m=l+((r-l)>>1); return max(sear((o<<1),l,m,ql,qr),sear((o<<1)|1,m+1,r,ql,qr));}int main(){ //freopen("a.in","r",stdin); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a0[i]); build(1,1,n); for(int i=1;i<=m;i++) { string c; int a,b; cin>>c; scanf("%d%d",&a,&b); if(c=="Q") printf("%d\n",sear(1,1,n,a,b)); else if(a0[a]