#include <iostream>
#include <algorithm>
using namespace std;
const long long N = 200005;
long long arr[N], n, m;
struct Tree {
long long l, r, maxx;
} tree[N * 4];
void built(long long i, long long l, long long r) {
tree[i].l = l;
tree[i].r = r;
if (l == r) {
tree[i].maxx = arr[l];
return;
}
long long mid = (l + r) >> 1;
built(i * 2, l, mid);
built(i * 2 + 1, mid + 1, r);
tree[i].maxx = max(tree[i * 2].maxx, tree[i * 2 + 1].maxx);
}
void add(long long i, long long j, long long k) {
tree[i].maxx = max(tree[i].maxx, k);
if (tree[i].l == tree[i].r) return;
long long mid = (tree[i].l + tree[i].r) >> 1;
if (j <= mid) add(i * 2, j, k);
if (j > mid) add(i * 2 + 1, j, k);
}
long long get_maxx(long long i, long long l, long long r) {
long long maxx = 0;
if (tree[i].l >= l && r >= tree[i].r) {
maxx = tree[i].maxx;
return maxx;
}
if (tree[i * 2].r >= l) {
maxx = max(get_maxx(i * 2, l, r), maxx);
}
if (tree[i * 2 + 1].l <= r) {
maxx = max(get_maxx(i * 2 + 1, l, r), maxx);
}
return maxx;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> arr[i];
built(1, 1, n);
for (int i = 1; i <= m; i++) {
char flag;
int a, b;
cin >> flag >> a >> b;
if (flag == 'U') {
add(1, a, b);
} else {
cout << get_maxx(1, a, b) << endl;
}
}
return 0;
}