都是基本模板,没什么特别说明的,线段树基础思想不了解点这里看线段树基础思想
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cerr << #x << '=' << x << '\n';
int a[212345];
int tree[812345];
void build(int node,int begin,int end){
if(begin==end){
// debug(node);
tree[node]=a[begin];
return;
}
int mid=(begin+end)/2;
build(node*2,begin,mid);
build(node*2+1,mid+1,end);
tree[node]=max(tree[node*2],tree[node*2+1]);
}
void update(int node,int begin,int end,int i,int x){
if(begin==end){
tree[node]=x;
return ;
}
int mid=(begin+end)/2;
if(i<=mid){
update(node*2,begin,mid,i,x);
}
else if(i>mid){
update(node*2+1,mid+1,end,i,x);
}
tree[node]=max(tree[node*2],tree[node*2+1]);
}
int query_max(int node,int begin,int end,int l,int r){
if(l<=begin&&r>=end){
return tree[node];
}
int mid=(begin+end)/2;
int ans=0;
if(l<=mid){
ans=max(query_max(node*2,begin,mid,l,r),ans);
}
if(r>mid){
ans=max(query_max(node*2+1,mid+1,end,l,r),ans);
}
return ans;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
memset(a,0,sizeof(a));
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
char C;
while(m--){
getchar();
scanf("%c",&C);
if(C=='Q'){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query_max(1,1,n,l,r));
}
else if(C=='U'){
int i,x;
scanf("%d%d",&i,&x);
update(1,1,n,i,x);
}
}
}
return 0;
}