#include <cstdio>
#include <algorithm>
using namespace std;
const int max_n = 200005;
int n, a[max_n], tree[max_n];
inline int low_bit(int x) { return x & -x; }
inline void Change(int p, int x) {
a[p] = x;
for (int i = p; i <= n; i += low_bit(i)) {
tree[i] = a[i];
for (int j = 1; j < low_bit(i); j *= 2)tree[i] = max(tree[i], tree[i - j]);
}
}
int Query(int L, int R) {//递归写法
if (L > R)return 0;
if (L <= R - low_bit(R) + 1)return max(tree[R], Query(L, R - low_bit(R)));
else return max(a[R], Query(L, R - 1));
}
inline int Query(int L, int R) {//非递归写法
int ans = 0;
while (L <= R) {
ans = max(ans, a[R]), --R;
while (L <= R - low_bit(R)) {
ans = max(ans, tree[R]);
R -= low_bit(R);
}
}
return ans;
}
char s[2];
signed main() {
// freopen("in", "r", stdin), freopen("out", "w", stdout);
int m;
while (scanf("%d %d", &n, &m) != EOF) {
for (int i = 1; i <= n; i++)tree[i] = a[i] = 0;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
Change(i, x);
}
while (m--) {
int x, y;
scanf("%s %d %d", s, &x, &y);
if (s[0] == 'U')Change(x, y);
if (s[0] == 'Q')printf("%d\n", Query(x, y));
}
}
return 0;
}