P1531 I Hate It
树状数组求区间最大值
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=2e5+10;
int n,m;
int tr[N*4],a[N];
int lowbit(int x){
return x&-x;
}
void change(int x,int y){
for(int i=x;i<=n;i+=lowbit(i)) tr[i]=max(tr[i],y);
}
int query(int x,int i){
int res=0;
for(;i-lowbit(i)>=x;i-=lowbit(i)) res=max(res,tr[i]);
for(;i>=x;i--) res=max(res,a[i]);
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
change(i,a[i]);
}
while(m--){
char c;
int x,y;
cin>>c;
if(c=='U'){
cin>>x>>y;
change(x,y);
a[x]=max(a[x],y);
}else{
cin>>x>>y;
cout<<query(x,y)<<endl;
}
}
return 0;
}