练下区间最大值的手lololol,以前写线段树竟然超时。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define lson l,mid,sz<<1
#define rson mid+1,r,sz<<1|1
using namespace std;
const int sz = 200001;
int a[sz<<2];
void buildd(int l,int r,int sz){
if(l == r){
scanf("%d",&a[sz]);
return;
}
int mid = (l+r)>>1;
buildd(lson);
buildd(rson);
a[sz] = max(a[sz<<1],a[sz<<1|1]);
}
void add(int l,int r,int sz,int aa,int bb){
if(l == r&&l == aa){
a[sz] = bb;
return;
}
int mid = (l+r)>>1;
if(aa > mid) add(rson,aa,bb);
else add(lson,aa,bb);
a[sz] = max(a[sz<<1],a[sz<<1|1]);
}
int un(int l,int r,int sz,int aa,int bb){
if(l >= aa&&bb >= r){
return a[sz];
}
int mid = (l+r)>>1;
int q1 = 0;
if(mid >= aa) q1 = max(q1,un(lson,aa,bb));
if(mid < bb) q1 = max(q1,un(rson,aa,bb));
return q1;
}
int main(){
int n,m,a,b;
char q;
while(~scanf("%d%d",&n,&m)){
buildd(1,n,1);
while(m--){
getchar();
scanf("%c%d%d",&q,&a,&b);
if(q == 'U'){
add(1,n,1,a,b);
}
else{
cout<<un(1,n,1,a,b)<<endl;
}
}
}
return 0;
}