#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=0;ch=getchar();}
while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return f?x:-x;
}
inline void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>=10)write(x/10);
putchar(x%10+48);
}
int n,m,v[300010],t[300010],l[300010],r[300010],d[300010];
int sz[300010],rt[300010],f[300010],tag=0;
multiset<int>s;
int merge(int x,int y){
if(!x||!y)return x+y;
if(v[x]<v[y])swap(x,y);
f[r[x]=merge(r[x],y)]=x;
if(d[r[x]]>d[l[x]])swap(l[x],r[x]);
d[x]=d[r[x]]+1;
return x;
}
int find(int x){
return x==rt[x]?x:rt[x]=find(rt[x]);
}
void pushdown(int x,int qwq){
if(!x)return;
v[x]+=qwq;
pushdown(l[x],qwq);
pushdown(r[x],qwq);
}
int main(){
n=read();d[0]=-1;
for(int i=1;i<=n;i++){
v[i]=read();rt[i]=i;sz[i]=1;
s.insert(v[i]);
}
m=read();
for(int x,y,p,q;m;m--){
string op;
cin>>op;
if(op=="U"){
x=read();y=read();
x=find(x);y=find(y);
if(x!=y){
if(sz[x]>sz[y])swap(x,y);
pushdown(x,t[x]-t[y]);
rt[x]=rt[y]=merge(x,y);
if(rt[x]==x){
s.erase(s.find(v[y]+t[y]));
t[x]=t[y];sz[x]+=sz[y];t[y]=sz[y]=0;
}else{
s.erase(s.find(v[x]+t[y]));
sz[y]+=sz[x];t[x]=sz[x]=0;
}
}
}else if(op=="A1"){
x=read();y=find(x);
if(x==y){
s.erase(s.find(v[x]+t[x]));
f[l[x]]=f[r[x]]=0;
y=merge(l[x],r[x]);v[x]+=read();
f[x]=l[x]=r[x]=d[x]=0;
rt[x]=rt[y]=p=merge(x,y);
if(x!=p){
t[p]=t[x];t[x]=0;
sz[p]=sz[x];sz[x]=0;
}
s.insert(v[p]+t[p]);
}else{
f[l[x]]=f[r[x]]=f[x];
p=merge(l[x],r[x]);
if(x==r[f[x]])r[f[x]]=p;
else l[f[x]]=p;
v[x]+=read();
f[x]=l[x]=r[x]=d[x]=0;
rt[x]=rt[y]=merge(x,y);
if(rt[x]==x){
s.erase(s.find(v[y]+t[y]));
s.insert(v[x]+t[y]);
t[x]=t[y];sz[x]=sz[y];t[y]=sz[y]=0;
}
}
}else if(op=="A2"){
x=find(read());
s.erase(s.find(v[x]+t[x]));
t[x]+=read();
s.insert(v[x]+t[x]);
}else if(op=="A3")tag+=read();
else if(op=="F1"){
x=read();
cout<<v[x]+t[find(x)]+tag<<'\n';
}else if(op=="F2"){
x=find(read());
cout<<v[x]+t[x]+tag<<'\n';
}else cout<<*s.rbegin()+tag<<'\n';
}
return 0;
}