代码如下,第二个和第九个点wa了,原因是Too long 但是开o2又莫名AC了
#include<bits/stdc++.h>
#define MAX_N 2000005
using namespace std;
long long a[MAX_N],dat[MAX_N*4];
int n,m;
void build(int l,int r,int k){
if(l==r){
dat[k]=a[l];
return ;
}
int m=(l+r)>>1;
build(l,m,k+k);
build(m+1,r,k+k+1);
dat[k]=max(dat[k+k],dat[k+k+1]);
return ;
}
void update(int x,int l,int r,int k,int z){
if(x==l&&x==r){
if(dat[k]<=z)
dat[k]=z;
return ;
}
int m=(l+r)>>1;
if(x<=m)
update(x,l,m,k+k,z);
else if(x>m)
update(x,m+1,r,k+k+1,z);
dat[k]=max(dat[k+k],dat[k+k+1]);
}
long long calc(int x,int y,int l,int r,int k){
if(x==l&&y==r)return dat[k];
int m=(l+r)>>1;
if(y<=m)
return calc(x,y,l,m,k+k);
else
if(x>m)
return calc(x,y,m+1,r,k+k+1);
else
return max(calc(x,m,l,m,k+k),
calc(m+1,y,m+1,r,k+k+1));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;n>=i;i++)
scanf("%lld",&a[i]);
build(1,n,1);
char c;
int x,y;
for(int i=0;m>i;i++){
scanf("%s",&c);
if(c=='Q'){
scanf("%d%d",&x,&y);
printf("%lld\n",calc(x,y,1,n,1));
}else{
scanf("%d%d",&x,&y);
update(x,1,n,1,y);
}
}
return 0;
}