维护区间最值
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
const int M=200005;
struct RMQ
{
int l;
int r;
int maxx;
};
RMQ t[M*4+1];
int s[M*2];
int n,m;
int res=0;
void add(int x, int y, int k)
{
if (t[k].l==x && t[k].r==x)
{
t[k].maxx=y;
return;
}
else
{
int mid=(t[k].l+t[k].r)/2;
if (x<=mid) add(x, y, k*2);
else add(x, y, k*2+1);
t[k].maxx=max(t[k*2].maxx, t[k*2+1].maxx);
}
}
void query(int l, int r, int k)
{
if (t[k].l==l && t[k].r==r) res=max(res, t[k].maxx);
else
{
int mid=(t[k].l+t[k].r)/2;
if (l> mid ) query(l, r, k*2+1);
else if (r<=mid) query(l ,r, k*2);
else
{
query(l, mid, k*2);
query(mid+1, r, k*2+1);
}
}
}
void build(int l, int r, int k)
{
t[k].l=l;
t[k].r=r;
if (l==r) t[k].maxx=s[r];
else
{
int mid=(l+r)/2;
build(l, mid, k*2);
build(mid+1, r, k*2+1);
t[k].maxx=max(t[k*2].maxx, t[k*2+1].maxx);
}
}
int main()
{
while (scanf("%d%d", &n, &m)!=EOF)
{
memset(s, 0, sizeof(s));
for (int i=1; i<=n; i++) scanf("%d", &s[i]);
build(1,n,1);
while (m--)
{
char ss;
int x, y;
cin>>ss>>x>>y;
if (ss=='Q')
{
res=0;
query(x, y, 1);
printf("%d\n", res);
}
else
{
add(x, y, 1);
}
}
}
return 0;
}