#include<iostream>
using namespace std;
const int N = 8 * 1E5 + 10;
struct tree {
int l;
int r;
int maxnum;
} tr[N];
int n, m;
int a[N];
void pushup(int u) {
tr[u].maxnum = max(tr[2 * u].maxnum, tr[2 * u + 1].maxnum);
}
void build(int u, int l, int r) {
if (l == r)
tr[u] = {l, r, a[l]};
else {
tr[u]={l,r};
int mid = l + r >> 1;
build(2 * u, l, mid);
build(2 * u + 1, mid + 1, r);
pushup(u);
}
}
int query(int u, int l, int r) {
int ans = -1e7;
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].maxnum;
else {
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid)
ans = query(2 * u, l, r);
if (r > mid)
ans = max(ans, query(2 * u + 1, l, r));
}
return ans;
}
void modify(int u, int x, int k) {
if (tr[u].l == tr[u].r)
{
tr[u].maxnum=k;
return ;
}
else {
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid)
modify(2 * u, x, k);
else
modify(2 * u + 1, x, k);
pushup(u);
}
}
int main() {
cin >> n>>m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, 1, n);
while (m--) {
char c;
int l, r;
cin >> c;
if (c == 'Q') {
cin >> l >> r;
cout << query(1, l, r) << endl;
}
if (c == 'U') {
cin >> l >> r;
if (a[l] >= r)
continue;
else
modify(1, l, r);
}
}
return 0;
}