#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 200007
#define INF 10000000
using namespace std;
int n,m;
int a[MAX];
struct Node
{
int l,r,maxn;
}tree[MAX<<2];
void push_up ( int u )
{
tree[u].maxn = max ( tree[u<<1].maxn , tree[u<<1|1].maxn );
}
void build ( int u , int l , int r )
{
tree[u].l = l , tree[u].r = r;
if ( l == r )
{
tree[u].maxn = a[l];
return;
}
int mid = l + r >> 1;
build ( u<<1 , l , mid );
build ( u<<1|1 , mid+1 , r );
push_up ( u );
}
void update ( int u , int x , int v )
{
int l = tree[u].l , r = tree[u].r;
if ( l == r )
{
tree[u].maxn = v;
return;
}
int mid = l+r>>1;
if ( x > mid ) update ( u<<1|1 , x , v );
else update ( u<<1 , x , v );
push_up ( u );
}
int query ( int u , int left , int right )
{
int l = tree[u].l , r = tree[u].r;
if ( left <= l && r <= right )
return tree[u].maxn;
int mid = l + r >> 1;
int ret = -INF;
if ( right >= l && left <= mid )
ret = max ( ret , query ( u<<1 , left , right ) );
if ( right > mid && left <= r )
ret = max ( ret , query ( u<<1|1 , left , right ) );
return ret;
}
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &m ) )
{
for ( int i = 1 ; i <= n ; i++ )
scanf ( "%d" , &a[i] );
build ( 1 , 1 , n );
char s[5];
int l , r;
for ( int i = 0 ; i < m ; i++ )
{
scanf ( "%s" , s );
scanf ( "%d%d" , &l , &r );
if ( s[0] == 'Q' )
printf ( "%d\n" , query ( 1 , l , r ) );
else update ( 1 , l , r );
}
}
}