#include <algorithm>
#include <iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cctype>
#include<vector>
#include<deque>
#include<map>
#include<set>

#define M 200000
#define inf 0x3f3f3f3f
typedef long long ll;

using namespace std;

struct Data
{
    int max;
    int left, right;
}tree[M*4];
int n, m;
int ans;
int x, y;
char ch;

void built(int l,int r,int k) {
    tree[k].left = l, tree[k].right = r;
    if (l == r) {
        scanf("%d", &tree[k].max);
        return;
    }
    int mid = (l + r) / 2;
    built(l, mid,k*2);
    built(mid + 1, r, k * 2 + 1);
    tree[k].max = max(tree[k * 2].max, tree[k * 2 + 1].max);
}

void search(int k) {
    if (tree[k].left >= x && tree[k].right <= y) {
        ans = max(ans, tree[k].max);
        return;
    }
    int mid = (tree[k].left + tree[k].right) / 2;
    if (x <= mid) search(k * 2);
    if(y>mid) search(k * 2 + 1);
}

void change_inv(int k) {
    if (tree[k].left == tree[k].right) {
        tree[k].max = y;
        return;
    }
    int mid = (tree[k].left + tree[k].right) / 2;
    if (x <= mid) change_inv(k * 2);
    else change_inv(k * 2 + 1);
    tree[k].max = max(tree[k * 2].max, tree[k * 2 + 1].max);
}

int main() {
    while (scanf("%d%d",&n,&m)!=EOF){
        built(1, n, 1);
        while (m--){
            cin >> ch;
            scanf("%d%d", &x, &y);
            if(ch=='Q'){
                ans = 0;
                search(1);
                printf("%d\n", ans);
            }
            else {
                change_inv(1);
            }
        }
    }
    return 0;
}