知识点:
线段树(单点修改+区间查询+简单最值)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[200500],tr[900500];
int n,m;
char c;
void bud_tr(int r,int lf,int rg){
if(lf==rg){
tr[r]=num[lf];
return ;
}
int lf_r=2*r;
int rg_r=2*r+1;
int mid=(lf+rg)/2;
bud_tr(lf_r,lf,mid);
bud_tr(rg_r,mid+1,rg);
tr[r]=max(tr[lf_r],tr[rg_r]);(模板改改改成维护最大值)
}
int query(int r,int srt,int edi,int lf,int rg){
if(lf<=srt&&edi<=rg)return tr[r];
int lf_r=2*r;
int rg_r=2*r+1;
int mid=(srt+edi)/2;
int sum1=-1,sum2=-1;
if(lf<=mid)sum1=query(lf_r,srt,mid,lf,rg);
if(mid<rg)sum2=query(rg_r,mid+1,edi,lf,rg);
return max(sum1,sum2);(两边搜搜索最大值)
}
void cge_tr(int r,int lf,int rg,int goal,int k){
if(lf==rg){
tr[r]=k;(直接赋值)
return ;
}
int lf_r=2*r;
int rg_r=2*r+1;
int mid=(lf+rg)/2;
if(goal<=mid)cge_tr(lf_r,lf,mid,goal,k);
else cge_tr(rg_r,mid+1,rg,goal,k);
tr[r]=max(tr[lf_r],tr[rg_r]);(维护最大值)
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){(这个代表了不断地输入一直到文件输入结束)
int i,a,b;
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
bud_tr(1,1,n);
for(i=1;i<=m;i++){
scanf("%s %d %d",&c,&a,&b);
if(c=='Q')printf("%d\n",query(1,1,n,a,b));
else cge_tr(1,1,n,a,b);
}
}
}