#include <set>
#include <bitset>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
#define lson rt << 1, l, m
#define rson rt << 1 | 1, m + 1, r
using namespace std;
const int INF = 0x7FFFFFFF;
const double EPS = 1e-10;
const double PI = 2 * acos (0.0);
const int MOD = 10000007;
const int maxn = 200000;
int maxval[maxn<<2];
void PushUp (int rt)
{
maxval[rt] = max (maxval[rt<<1], maxval[rt<<1|1]);
}
void Build (int rt, int l, int r)
{
if (l == r)
{
scanf("%d", &maxval[rt]);
return ;
}
int m = (l + r) >> 1;
Build (lson);
Build (rson);
PushUp (rt);
}
void UpDate (int rt, int l, int r, int p, int add)
{
if (l == r)
{
maxval[rt] = add;
return ;
}
int m = (l + r) >> 1;
if (p <= m) UpDate (lson, p, add);
else UpDate (rson, p, add);
PushUp (rt);
}
int Query (int rt, int l, int r, int L, int R)
{
if (L <= l && r <= R)
{
return maxval[rt];
}
int m = (l + r) >> 1;
int ans = -INF;
if (L <= m)
ans = max (ans, Query (lson, L, R));
if (R > m)
ans = max (ans, Query (rson, L, R));
return ans;
}
int main()
{
// freopen ("aaa.txt", "r", stdin);
int n, m;
while (scanf ("%d%d", &n, &m) != EOF)
{
Build (1, 1, n);
char cmd[6];
int val_a, val_b;
int i;
for (i = 0; i < m; i++)
{
scanf ("%s%d%d", cmd, &val_a, &val_b);
if (cmd[0] == 'Q')
printf ("%d\n", Query (1, 1, n, val_a, val_b));
else
UpDate (1, 1, n, val_a, val_b);
}
}
return 0;
}