#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1;
int n, m, x, y, t[N], a[N];
#define lc(p) (p << 1)
#define rc(p) (p << 1 | 1)
inline void push_up(int rt) {t[rt]=max(t[lc(rt)],t[rc(rt)]);}
void build(int rt, int l, int r)
{
if (l == r) {t[rt] = a[l]; return;}
int mid = (l + r) >> 1;
build(lc(rt), l, mid); build(rc(rt), mid + 1, r);
push_up(rt);
}
void change(int rt, int l, int r, int p, int k)
{
if (l == p && p == r)
{
if (t[rt] < k)
t[rt] = k;
return;
}
int mid = (l + r) >> 1;
if (p <= mid) change(lc(rt), l, mid, p, k);
else change(rc(rt), mid + 1, r, p, k);
push_up(rt);
}
int query(int rt, int l, int r, int x, int y)
{
if (l <= x && y <= r)
return t[rt];
int mid = (x + y) >> 1, ans = -1;
if (l <= mid)
ans = max(ans, query(lc(rt), l, r, x, mid));
if (r > mid)
ans = max(ans, query(rc(rt), l, r, mid + 1, y));
return ans;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> a[i];
build(1, 1, n);
while (m--)
{
char opt; cin >> opt;
if (opt == 'U')
{
cin >> x >> y;
if (a[x] < y)
a[x] = y, change(1, 1, n, x, y);
}
else
{
cin >> x >> y;
cout << query(1, 1, n, x, y) << endl;
}
}
return 0;
}