单点替换线段树。
注意区间保存的是该区间最大值即可。
线段树基本结构请参照代码。
推荐线段树文章:http://www.notonlysuccess.com/index.php/segment-tree-complete/
#include <iostream>
#include <cstdio>
#include <cstdio>
using namespace std;
const int maxx = 200010;
struct po
{
int lson,rson;
int key;
} point[maxx<<2];
void build(int left, int right , int dex)
{
point[dex].lson = left;
point[dex].rson = right;
if(left==right)
return ;
int mid = (left+right)/2;
build(left,mid,dex<<1);
build(mid+1,right,dex<<1|1);
}
void updata(int position, int cge, int dex)
{
if(point[dex].lson == point[dex].rson)
{
point[dex].key = cge;
return ;
}
int mid = (point[dex].lson+point[dex].rson)/2;
if(position<=mid) updata(position,cge,dex<<1);
else updata(position,cge,dex<<1|1);
point[dex].key = max(point[dex<<1].key,point[dex<<1|1].key);
}
int query(int left, int right, int dex)
{
if(left==point[dex].lson && right==point[dex].rson)
return point[dex].key;
int mid = (point[dex].lson + point[dex].rson)/2;
if(right<=mid) return query(left,right,dex<<1);
else if(left>mid) return query(left,right,dex<<1|1);
else return max(query(left,mid,dex<<1),query(mid+1,right,dex<<1|1));
}
int main()
{
// freopen("1754.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,n,1);
for(int i=1; i<=n; i++)
{
int tem;
scanf("%d",&tem);
updata(i,tem,1);
}
char ch;
int a,b;
for(int i=1; i<=m; i++)
{
getchar();
scanf("%c %d %d",&ch,&a,&b);
if(ch=='Q')
printf("%d\n",query(a,b,1));
else
updata(a,b,1);
}
}
return 0;
}