rt,是P1531
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m;
int a[N],sum[N*4],tag[N*4];
inline int lc(int x){
return x<<1;
}
inline int rc(int x){
return x<<1|1;
}
void pushup(int x){
sum[x]=max(sum[lc(x)],sum[rc(x)]);
}
void buildtree(int x,int l,int r){
if(l==r){
sum[x]=a[l];
return ;
}
int mid=(l+r)/2;
buildtree(lc(x),l,mid);
buildtree(rc(x),mid+1,r);
pushup(x);
}
void update(int x,int l,int r,int l1,int r1){
if(l==r){
if(sum[x]<r1)sum[x]=r1;
return ;
}
int mid=(l+r)/2;
if(l1<=mid)update(lc(x),l,mid,l1,r1);
else update(rc(x),mid+1,r,l1,r1);
pushup(x);
}
int query(int x,int l,int r,int l1,int r1){
if(l1<=l&&r<=r1) return sum[x];
int mid=(l+r)/2;
int res=-1e9;
if(l1<=mid)res=max(res,query(lc(x),l,mid,l1,r1));
if(mid<r1)res=max(res,query(rc(x),mid+1,r,l1,r1));
return res;
}
signed main(){
int x,y,k;
char op;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
buildtree(1,1,n);
while(m--){
cin>>op>>x>>y;//scanf("%c",&op);
if(op=='Q'){
printf("%lld\n",query(1,1,n,x,y));
}else{
update(1,1,n,x,y);
}
}
return 0;
}
看代码第60到64行,这里面的如果判断
if(op=='U'){
update(1,1,n,x,y);
}else{
printf("%lld\n",query(1,1,n,x,y));
}
就会WA 20分,反过来就AC,不知道为什么求助