#include<bits/stdc++.h>
using namespace std;
long long ansx,ansxx,n,T;
long long a[100001],tree[400001],mx[400001],mxx[400001],x,y;
string st;
void build(int o,int l,int r){
if(l==r){
tree[o]=a[l];
mx[o]=a[l];
mxx[o]=0;
return;
}
int mid=(l+r)>>1;
build(o*2,l,mid);
build(o*2+1,mid+1,r);
if(mx[o*2]>mx[o*2+1]){
mx[o]=mx[o*2];
mxx[o]=max(mx[o*2+1],mxx[o*2]);
}
else{
mx[o]=mx[o*2+1];
mxx[o]=max(mxx[o*2+1],mx[o*2]);
}
}
void query(int o,int l,int r){
if(l>=x&&r<=y){
if(ansx<mx[o]){
ansx=mx[o];
ansxx=max(ansxx,mxx[o]);
}
else{
ansxx=max(ansxx,mx[o]);
}
return;
}
int mid=(l+r)>>1;
if(x<=mid)query(o*2,l,mid);
if(y>mid)query(o*2+1,mid+1,r);
}
void update(int o,int l,int r){
if(l==r){
tree[o]=y;
mx[o]=y;
mxx[o]=0;
return;
}
int mid=(l+r)>>1;
if(x<=mid)update(o*2,l,mid);
else update(o*2+1,mid+1,r);
if(mx[o*2]>mx[o*2+1]){
mx[o]=mx[o*2];
mxx[o]=max(mx[o*2+1],mxx[o*2]);
}
else{
mx[o]=mx[o*2+1];
mxx[o]=max(mxx[o*2+1],mx[o*2]);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
cin>>T;
while(T--){
cin>>st>>x>>y;
if(st=="Q"){
ansx=ansxx=0;
query(1,1,n);
cout<<ansx+ansxx<<endl;
}
else update(1,1,n);
}
return 0;
}