#include <stdio.h>
typedef struct NODE {
int lc,rc;
int grade;
int first,mid,tail;
}node;
node s[600005];
int gra[200005];
int Max(int a,int b){return a>b?a:b;}
void Maketree(int first,int tail,int at){
s[at].first = first;
s[at].tail = tail;
if( first == tail )
s[at].grade = gra[first];
else{
s[at].lc = at*2;
s[at].rc = at*2+1;
s[at].mid = (first+tail) / 2;
Maketree(first,s[at].mid,s[at].lc);
Maketree(s[at].mid+1,tail,s[at].rc);
s[at].grade = Max( s[s[at].lc].grade , s[s[at].rc].grade);
}
}
int Query(int first,int tail,int at){
int l,r;
if( s[at].first == first && s[at].tail == tail )
return s[at].grade;
if( first > s[at].mid ) return Query(first,tail,s[at].rc);
else if( tail < s[at].mid+1 ) return Query(first,tail,s[at].lc);
else{
l = Query(first , s[at].mid , s[at].lc);
r = Query(s[at].mid+1 , tail , s[at].rc);
return l > r ? l : r ;
}
}
void Updata(int i,int grade,int at){
if( s[at].first == s[at].tail ){
s[at].grade = grade;
}
else{
if( i <= s[at].mid ){
Updata(i,grade,s[at].lc);
}
else Updata(i,grade,s[at].rc);
s[at].grade = Max( s[s[at].lc].grade , s[s[at].rc].grade );
}
}
int main(){
int n,m,i,a,b;
char c;
while(scanf("%d%d",&n,&m)!=EOF){
for( i = 1 ; i <= n ; i++){
scanf("%d",&gra[i]);
}
Maketree(1,n,1);
while(m--){
getchar();
scanf("%c%d%d",&c,&a,&b);
if( c == 'Q' ) printf("%d\n",Query(a,b,1));
if( c == 'U' ) Updata(a,b,1);
}
}
return 0;
}
浙公网安备 33010602011771号