#include <bits/stdc++.h>

using namespace std;

struct Node{  int value;  int left,right;
};
const int N=200005;
Node node[4*N];
int father[N];
int n,m,g;
string op;
int a,b;

void buildTree(int i,int l,int r){  node[i].left=l;  node[i].right=r;  node[i].value=0;  if(l==r){  father[l]=i;  return;  }  buildTree(i*2,l,(l+r)/2);//如果用位运算,位运算优先级比四则运算低  buildTree(i*2+1,(l+r)/2+1,r);
}

void upData(int ri){  if(ri==1) return;  int fi=ri/2;  int a=node[fi*2].value,  b=node[fi*2+1].value;  node[fi].value=max(a,b);  upData(ri/2);
}

int Max;
void query(int i,int l,int r){  if(l==node[i].left&&r==node[i].right){  Max=max(node[i].value,Max);  return;  }    i*=2;  if(l<=node[i].right){//不用管l<node[i].left情况,这个情况会被切到左边的同级,现在只管 node[i.left到node[i.right的情况  if(r<=node[i].right) query(i,l,r);  else query(i,l,node[i].right);  }  i++;  if(r>=node[i].left){  if(l>=node[i].left) query(i,l,r);  else query(i,node[i].left,r);  }
}

int main(int argc, char** argv) {  ios::sync_with_stdio(false);  while(cin>>n>>m){  buildTree(1,1,n);  for(int i=1;i<=n;i++){  cin>>g;  node[father[i]].value=g;  upData(father[i]);  }    for(int i=1;i<=m;i++){  cin>>op>>a>>b;  if(op[0]=='Q'){  Max=0;  query(1,a,b);cout<<Max<<endl;  }else{  node[father[a]].value=b;  upData(father[a]);  }  }  }  return 0;
}