#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
char ch;
inline void read(int &x){
while((ch = getchar()) < 48 || ch > 57);
x=ch ^ 48;
while((ch = getchar()) < 58 && ch > 47)
x = (x << 1)+(x << 3)+(ch ^ 48);
}
inline void write(const int &x){
if(x > 9) write(x / 10);
putchar(x % 10 + 48);
}
int n,m,a[N];
struct node{
int maxn;
}t[4 * N];
void build(int l,int r,int p){
if (l == r) {t[p].maxn = a[l];return;}
int mid = (l + r) / 2;
build(l,mid,(p << 1));
build(mid + 1,r,(p << 1) + 1);
t[p].maxn = max(t[(p << 1)].maxn,t[(p << 1) + 1].maxn);
}
void change(int l,int r,int p,int x,int v){
if (l == r){t[p].maxn = v;return;}
int mid = (l + r) / 2;
if (x <= mid) change(l,mid,(p << 1),x,v);
else change(mid + 1,r,(p << 1) + 1,x,v);
t[p].maxn = max(t[(p << 1)].maxn,t[(p << 1) + 1].maxn);
}
int ask(int l,int r,int p,int ql,int qr){
if (ql <= l and r <= qr) return t[p].maxn;
int mid = (l + r) / 2;
if (qr <= mid) return ask(l,mid,(p << 1),ql,qr);
if (ql > mid) return ask(mid + 1,r,(p << 1) + 1,ql,qr);
return max(ask(l,mid,(p << 1),ql,qr),ask(mid + 1,r,(p << 1) + 1,ql,qr));
}
int main(){
read(n);read(m);
for (int i = 1;i <= n;i++) read(a[i]);
build(1,n,1);
for (int i = 1;i <= m;i++){
char op;op = getchar();
int aa,bb;read(aa);read(bb);
if (op == 'U') change(1,n,1,aa,bb);
else{
write(ask(1,n,1,aa,bb));
putchar('\n');
}
}
return 0;
}