#include<bits/stdc++.h>
#define ls u<<1
#define rs u<<1|1
using namespace std;
const int N=3e4+5,Q=3e5+5;
int n,q,a[N],b[N],fat[N],t[N<<2];
int cnt,fa[N],dep[N],siz[N],hs[N],w[N],top[N];
vector<int> g[N];
bool vis[N];
struct data
{
int opt,x,y;
}p[Q];
void dfs1(int u,int fath)
{
fa[u]=fath;
dep[u]=dep[fath]+1;
siz[u]=1;
hs[u]=-1;
for(auto v:g[u])
{
if(v==fath||dep[v]) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
}
}
void dfs2(int u,int t)
{
if(vis[u]) return;
vis[u]=true;
top[u]=t;
w[u]=++cnt;
b[cnt]=a[u];
if(hs[u]!=-1) dfs2(hs[u],t);
for(auto v:g[u])
if(v!=fa[u]&&hs[u]!=v)
dfs2(v,v);
}
void push_up(int u)
{
t[u]=t[ls]+t[rs];
}
void build(int u,int l,int r)
{
if(l==r)
{
t[u]=b[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(u);
}
void update(int u,int l,int r,int x,int k)
{
if(x<l||r<x) return;
if(l==r)
{
t[u]=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(ls,l,mid,x,k);
else update(rs,mid+1,r,x,k);
push_up(u);
}
int query(int u,int l,int r,int x,int y)
{
if(y<l||r<x) return 0;
if(x<=l&&r<=y) return t[u];
int mid=(l+r)>>1,res=0;
if(x<=mid) res+=query(ls,l,mid,x,y);
if(y>mid) res+=query(rs,mid+1,r,x,y);
return res;
}
int modify(int u,int v)
{
int ans=0;
while(top[u]^top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=query(1,1,n,w[top[u]],w[u]);
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans+=query(1,1,n,w[v],w[u]);
return ans;
}
int find(int x)
{
return fat[x]==x?x:fat[x]=find(fat[x]);
}
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i),fat[i]=i;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
char opt[15];
scanf("%s%d%d",opt,&p[i].x,&p[i].y);
if(opt[0]=='b')
{
p[i].opt=1;
g[p[i].x].push_back(p[i].y);
g[p[i].y].push_back(p[i].x);
}
if(opt[0]=='p') p[i].opt=2;
if(opt[0]=='e') p[i].opt=3;
}
for(int i=1;i<=n;i++)
if(!dep[i]) dfs1(i,0),dfs2(i,i);
build(1,1,n);
for(int i=1;i<=q;i++)
if(p[i].opt==1)
{
int xx=find(p[i].x),yy=find(p[i].y);
if(xx==yy) printf("no\n");
else printf("yes\n"),fat[xx]=yy;
}
else if(p[i].opt==2) update(1,1,n,w[p[i].x],p[i].y);
else
{
int xx=find(p[i].x),yy=find(p[i].y);
if(xx^yy) printf("impossible\n");
else printf("%d\n",modify(p[i].x,p[i].y));
}
return 0;
}