求区间最大值单点修改的板子题
被老师卡了,1e6的数据RE了一个点
不知道如何解决
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10,INF=0x3f3f3f3f;
int n,m,a[N],L[1001],R[1001],mx[1001],q,b[N];
signed main(){
//freopen("1.txt","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
q=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i],b[i]=(i-1)/q+1,mx[b[i]]=max(a[i],mx[b[i]]);
if(b[i]!=b[i-1])L[b[i]]=i,R[b[i-1]]=i-1;
}
R[b[n]]=n;
while(m--){
string c;
int x,y;
cin>>c>>x>>y;
if(c[0]=='C'){
if(y>a[x])mx[b[x]]=max(mx[b[x]],y),a[x]=y;
else if(a[x]!=mx[b[x]])a[x]=y;
else{
int k=b[x];a[x]=y,mx[k]=-INF;
for(int i=L[k];i<=R[k];i++)mx[k]=max(mx[k],a[i]);
}
}
else{
int res=-INF;
if(x>y)swap(x,y);
if(b[x]==b[y]){
for(int i=x;i<=y;i++)res=max(a[i],res);
cout<<res<<'\n';
continue;
}
for(int i=x;i<=R[b[x]];i++)res=max(a[i],res);
for(int i=b[x]+1;i<b[y];i++)res=max(res,mx[i]);
for(int i=L[b[y]];i<=y;i++)res=max(res,a[i]);
cout<<res<<'\n';
}
}
}