#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=2e5+10;
struct BIT //binary index tree
{
int t[maxn],n;
int a[maxn];
#define lowbit(x) (x&(-x))
void init(int n_)
{
n=n_;
for(int i=1;i<=n;i++)
t[i]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
modify(i,a[i]);
}
}
int query(int l,int r)
{
int res=a[r];
while(r>l) //t[i]维护 [i-lowbit(i)+1,i]的最值
{
for(--r;r-lowbit(r)>=l;r-=lowbit(r))// r-lowbit(r)+1>=l return max t[r],query(l,r-low(r))
res=max(res,t[r]); // r-lowbit(r)+1<l return max a[r],query(l,r-1)
res=max(res,a[r]);
}
return res;
}
void modify(int x,int v)
{
a[x]=v;
while(x<=n)
{
t[x]=a[x];
for(int i=1,j=lowbit(x);i<j;i<<=1)// y+( lowbit(y)=2^i) =x
t[x]=max(t[x],t[x-i]); // 对pos=x的修改需要考虑其维护的(x-lowbit(x),x]区间里的数对该区间最值贡献
x+=lowbit(x); //转移至包含该区间的下一个位置
}
}
};
BIT t;
int main()
{
#ifdef shuaishuai
freopen("in.txt","r",stdin);
#endif // shuaishuai
int n,q;
while(~scanf("%d%d",&n,&q))
{
t.init(n);
for(char s[2];q--;)
{
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[0]=='U') t.modify(a,b);
else {
if(a>b)swap(a,b);
printf("%d\n",t.query(a,b));
}
}
}
return 0;
}