# include <iostream>
using namespace std;
const int N = 200010 ;
int n, m, s[ N] ;
struct Node
{
int l, r, v;
} tr[ N* 4 ] ;
inline void pushup ( int u)
{
tr[ u] . v= max ( tr[ u<< 1 ] . v, tr[ u<< 1 | 1 ] . v) ;
}
inline void build ( int u, int l, int r)
{
if ( l== r)
{
tr[ u] = ( Node) { l, r, s[ l] } ;
return ;
}
else
{
tr[ u] = ( Node) { l, r, 0 } ;
int mid= ( l+ r) >> 1 ;
build ( u<< 1 , l, mid) , build ( u<< 1 | 1 , mid+ 1 , r) ;
pushup ( u) ;
}
}
inline void modify ( int u, int l, int r)
{
if ( tr[ u] . l== l&& tr[ u] . r== r) tr[ u] . v= r;
else
{
int mid= ( tr[ u] . l+ tr[ u] . r) >> 1 ;
if ( l<= mid) modify ( u<< 1 , l, r) ;
else modify ( u<< 1 | 1 , l, r) ;
pushup ( u) ;
}
}
inline int query ( int u, int l, int r)
{
if ( tr[ u] . l>= l&& tr[ u] . r<= r) return tr[ u] . v;
else
{
int res= 0 ;
int mid= ( tr[ u] . l+ tr[ u] . r) >> 1 ;
if ( l<= mid) res= max ( res, query ( u<< 1 , l, r) ) ;
if ( r> mid) res= max ( res, query ( u<< 1 | 1 , l, r) ) ;
return res;
}
}
int main ( )
{
while ( cin>> n>> m)
{
for ( int i= 1 ; i<= n; i++ ) cin>> s[ i] ;
build ( 1 , 1 , n) ;
while ( m-- )
{
char op[ 2 ] ; int l, r; cin>> op>> l>> r;
if ( * op== 'Q' ) cout<< query ( 1 , l, r) << endl;
else modify ( 1 , l, r) ;
}
}
return 0 ;
}