#include <stdio.h>
#define M 200005
struct data{
l,r,max;
}line[3*M];
int num[M];
int max(int a,int b)
{
> b?a:b;
}
void buildtree(int left,int right,int
u)
{
left;
right;
right)
line[u].max = num[left];
buildtree(left,(left+right)/2,2*u);
buildtree((left+right)/2+1,right,2*u+1);
line[u].max = max(line[2*u].max,line[2*u+1].max);
}
void updata (int a,int b,int
u)
//更新数据
{
(line[u].l == line[u].r)
line[u].max = b;
if (a <= line[2*u].r)
updata (a,b,2*u);
if (a >= line[2*u+1].l)
updata(a,b,2*u+1);
line[u].max = max(line[2*u].max,line[2*u+1].max);
}
int query (int left,int right,int
u)
{
(line[u].l == left&&line[u].r ==
right)
return line[u].max;
<= (line[u].l+line[u].r)/2)
return query(left,right,2*u);
>= (line[u].l+line[u].r)/2+1)
return query (left,right,2*u+1);
return max
(query(left,(line[u].l+line[u].r)/2,2*u),query((line[u].l+line[u].r)/2+1,right,2*u+1));
}
int main ()
{
n,m,i,a,b;
c;
(~scanf ("%d%d",&n,&m))
for (i = 1;i <= n;i ++)
scanf ("%d",&num[i]);
buildtree(1,n,1);
while (m --)
{
getchar ();
//这里要注意多加个getchar()
scanf ("%c %d
%d",&c,&a,&b);
if (c == 'Q')