// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll int
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#define fi first
#define se second
#define M 1000000007
#define MAXN 30001
#define GIOIHAN 1000001
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 311
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end()); // dùng để nén sort mảng compare
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n, q ;
ll nodeVal[MAXN];
ll high[MAXN] ;
ll chainID[MAXN] ;
ll chainHead[MAXN] ;
ll par[MAXN] ;
ll sz[MAXN] ;
ll tour[MAXN] ;
ll fin[MAXN] ;
ll st[MAXN] ;
ll lab[MAXN] ;
ll visited[MAXN] ;
vector<ll> adj[MAXN] ;
ll curchain =1, timedfs = 0 ;
//**Struct**//
struct query { // 0 : bridge , 1 : penguins , 2 : excursion ;
ll t, x,y ;
} que[MAXN * 10 + 2009 ];
struct Seg {
ll val[MAXN << 2 ] ;
void build(ll id, ll l, ll r ) {
if(l == r ) {
val[id] = nodeVal[tour[l]] ;
} else {
ll m = l + r >> 1;
build(id<< 1, l, m );
build(id<<1|1, m+ 1, r ) ;
val[id] = val[id<<1] + val[id<<1|1] ;
}
}
ll get(ll id, ll l, ll r, ll u, ll v ) {
if(u > r || v < l ) return 0 ;
if(u <= l && v >= r ) return val[id] ;
ll m = l + r >> 1;
return get(id<< 1, l, m, u, v )+ get(id<<1|1, m + 1, r,u, v ) ;
}
void update(ll id, ll l, ll r, ll pos, ll value ) {
if(l == r ) val[id ] = value ;
else {
ll m = l + r >> 1 ;
if(m >= pos ) update(id<< 1, l, m, pos, value ) ;
else update(id<<1|1, m + 1, r, pos, value ) ;
val[id] = val[id<<1] + val[id<<1|1 ] ;
}
}
} seg ;
//**Function**//
ll LCA(ll u,ll v ) {
while(chainID[u] != chainID[v]) {
if(chainID[u] > chainID[v]) u = par[chainHead[chainID[u]]] ;
else v = par[chainHead[chainID[v]]] ;
}
return (high[u] > high[v] ? v : u );
}
void init() {
cin>>n;
for(ll i = 1 ; i <= n ; i ++ ) cin>>nodeVal[i];
}
ll find_set(ll a ) {
return lab[a] < 0 ? a : lab[a] = find_set(lab[a]) ;
}
bool union_set(ll u, ll v ) {
u = find_set(u) ;
v =find_set(v) ;
if(u == v ) return false;
if(lab[u] > lab[v]) swap(u, v);
lab[u] += lab[v] ;
lab[v] =u ;
return true;
}
void dfs(ll u, ll p ) {
sz[u] = 1 ;
for(ll v : adj[u]) {
if(v != p ) {
high[v] = high[u] + 1 ;
par[v]= u ;
dfs(v, u );
sz[u] += sz[v] ;
}
}
}
void hld(ll u,ll p ) {
if(!chainHead[curchain]) {
chainHead[curchain] = u ;
}
st[u] = ++ timedfs;
tour[timedfs] = u ;
chainID[u] = curchain ;
ll nxt = 0 ;
for(ll v : adj[u]) {
if(v == p ) continue ;
if( nxt ==0 || sz[v] >sz[nxt] ) nxt = v;
}
if(nxt ) {
hld(nxt,u ) ;
}
for(ll v : adj[u]) {
if(v !=p && v != nxt) {
curchain ++ ;
hld(v,u);
}
}
fin[u] = timedfs ;
}
ll truyvan(ll u,ll v ) {
ll lca = LCA(u, v), sum = 0 ;
while(chainID[u] != chainID[lca]) {
sum += seg.get(1, 1, n, st[chainHead[chainID[u]]], st[u]) ;
u = par[chainHead[chainID[u]]] ;
}
while(chainID[v] != chainID[lca]) {
sum += seg.get(1, 1, n, st[chainHead[chainID[v]]], st[v]) ;
v = par[chainHead[chainID[v]]] ;
}
if(high[u] > high[v] ) swap(u, v) ;
return sum + seg.get(1, 1, n, st[u], st[v]) ;
}
void prepare() {
cin>> q ;
memset(lab, -1, sizeof lab ) ;
for(ll i = 1 ; i <= q ; i ++ ) {
string t = "Cảm ơn các bạn đã dành thời gian đọc code của mình, ヾ(≧▽≦*)o , yêu !" ;
ll x, y ;
cin>> t >> x >> y;
if(t[0] == 'b' ) {
if(union_set(x, y)) {
adj[x].push_back(y) ;
adj[y].push_back(x) ;
}
que[i].t = 0 ;
} else if(t[0] == 'p') {
que[i].t = 1;
} else {
que[i].t = 2 ;
}
que[i].x = x ;
que[i].y = y ;
}
for(ll i = 1; i <= n ; i ++ )if(!sz[i])dfs(i, i );
memset(lab, -1, sizeof lab ) ;
for(ll i = 1; i <= n ; i ++ )if(!st[i])hld(i, i );
seg.build(1, 1, n ) ;
}
void solve() {// 0 : bridge , 1 : update , 2 : query ;
for(ll i = 1 ; i <= q ; i ++ ) {
ll u = que[i].x, v = que[i].y ;
if(que[i].t == 0 ) {
if(!union_set(u, v ) ) cout<< "no" << el ;
else {
cout<<"yes" << el ;
}
} else if(que[i].t == 1 ) {
seg.update(1, 1, n, st[u], v);
} else {
if(find_set(u) != find_set(v )) cout<< "impossible" << el ;
else {
cout<<truyvan (u, v ) << el ;
}
}
}
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
init();
prepare() ;
solve();
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgaW50CiNkZWZpbmUgZWwgIlxuIgojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgX19ST09UX18gaW50IG1haW4oKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAzMDAwMQojZGVmaW5lIEdJT0lIQU4gMTAwMDAwMQojZGVmaW5lIEJMT0NLX1NJWkUgNDI1CiNkZWZpbmUgTUFYX05PREUgMTAwMTAwMQojZGVmaW5lIExPRyAxOQojZGVmaW5lIEFMUEhBX1NJWkUgMjYKI2RlZmluZSBCQVNFIDMxMQojZGVmaW5lIE5BTUUgImZpbGUiCiNkZWZpbmUgY29tcGFyZSh2KSBzb3J0KCh2KS5iZWdpbigpLCAodikuZW5kKCkpOyAodikuZXJhc2UodW5pcXVlKCh2KS5iZWdpbigpLCAodikuZW5kKCkpLCAodikuZW5kKCkpOyAvLyBkw7luZyDEkeG7gyBuw6luIHNvcnQgbeG6o25nIGNvbXBhcmUKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbGwgTU9EW10gPSB7KGxsKTFlOSArIDIyNzcsIChsbCkxZTkgKyA1Mjc3LCAobGwpMWU5ICsgODI3NywgKGxsKTFlOSArIDkyNzcsIChsbCkgMWU5ICsgNyB9Owpjb25zdCBsbCBOTU9EID0gMTsKY29uc3QgaW50IGR4W10gPSB7LTEsIDAsIDEsMH07CmNvbnN0IGludCBkeVtdID0gezAsIDEsIDAsIC0xfTsKLy8qKlZhcmlhYmxlKiovLwpsbCBuLCBxIDsKbGwgbm9kZVZhbFtNQVhOXTsKbGwgaGlnaFtNQVhOXSA7CmxsIGNoYWluSURbTUFYTl0gOwpsbCBjaGFpbkhlYWRbTUFYTl0gOwpsbCBwYXJbTUFYTl0gOwpsbCBzeltNQVhOXSA7CmxsIHRvdXJbTUFYTl0gOwpsbCBmaW5bTUFYTl0gOwpsbCBzdFtNQVhOXSA7CmxsIGxhYltNQVhOXSA7CmxsIHZpc2l0ZWRbTUFYTl0gIDsKdmVjdG9yPGxsPiBhZGpbTUFYTl0gOwpsbCBjdXJjaGFpbiA9MSwgdGltZWRmcyA9IDAgOwovLyoqU3RydWN0KiovLwpzdHJ1Y3QgcXVlcnkgeyAvLyAwIDogYnJpZGdlICAgICwgMSA6IHBlbmd1aW5zICAgLCAyIDogZXhjdXJzaW9uICA7CiAgICBsbCB0LCB4LHkgOwp9IHF1ZVtNQVhOICogMTAgKyAyMDA5IF07CnN0cnVjdCBTZWcgewogICAgbGwgdmFsW01BWE4gPDwgMiAgXSA7CiAgICB2b2lkIGJ1aWxkKGxsIGlkLCBsbCBsLCBsbCByICkgewogICAgICAgIGlmKGwgPT0gciApIHsKICAgICAgICAgICAgdmFsW2lkXSA9IG5vZGVWYWxbdG91cltsXV0gOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxsIG0gPSBsICsgciA+PiAxOwogICAgICAgICAgICBidWlsZChpZDw8IDEsIGwsIG0gKTsKICAgICAgICAgICAgYnVpbGQoaWQ8PDF8MSwgbSsgMSwgciApIDsKICAgICAgICAgICAgdmFsW2lkXSA9IHZhbFtpZDw8MV0gKyB2YWxbaWQ8PDF8MV0gOwogICAgICAgIH0KICAgIH0KICAgIGxsIGdldChsbCBpZCwgbGwgbCwgbGwgciwgbGwgdSwgbGwgdiApIHsKICAgICAgICBpZih1ID4gciB8fCB2IDwgbCApIHJldHVybiAwIDsKICAgICAgICBpZih1IDw9IGwgJiYgdiA+PSByICkgcmV0dXJuIHZhbFtpZF0gOwogICAgICAgIGxsIG0gPSBsICsgciA+PiAxOwogICAgICAgIHJldHVybiBnZXQoaWQ8PCAxLCBsLCBtLCB1LCB2ICkrIGdldChpZDw8MXwxLCBtICsgMSwgcix1LCB2ICAgICApIDsKICAgIH0KICAgIHZvaWQgdXBkYXRlKGxsIGlkLCBsbCBsLCBsbCByLCBsbCBwb3MsIGxsIHZhbHVlICkgewogICAgICAgIGlmKGwgPT0gciApIHZhbFtpZCAgXSA9IHZhbHVlICA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxsIG0gID0gbCArIHIgPj4gMSA7CiAgICAgICAgICAgIGlmKG0gPj0gcG9zICkgdXBkYXRlKGlkPDwgMSwgbCwgbSwgcG9zLCB2YWx1ZSApICAgOwogICAgICAgICAgICBlbHNlIHVwZGF0ZShpZDw8MXwxLCBtICsgMSwgciwgcG9zLCB2YWx1ZSAgKSAgOwogICAgICAgICAgICB2YWxbaWRdID0gdmFsW2lkPDwxXSArIHZhbFtpZDw8MXwxIF0gIDsKICAgICAgICB9CiAgICB9Cn0gc2VnIDsKLy8qKkZ1bmN0aW9uKiovLwpsbCBMQ0EobGwgdSxsbCB2ICkgewogICAgd2hpbGUoY2hhaW5JRFt1XSAhPSBjaGFpbklEW3ZdKSB7CiAgICAgICAgaWYoY2hhaW5JRFt1XSA+IGNoYWluSURbdl0pIHUgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdV1dXSA7CiAgICAgICAgZWxzZSB2ID0gcGFyW2NoYWluSGVhZFtjaGFpbklEW3ZdXV0gOwogICAgfQogICAgcmV0dXJuIChoaWdoW3VdID4gaGlnaFt2XSA/IHYgOiB1ICApOwp9CnZvaWQgaW5pdCgpIHsKICAgIGNpbj4+bjsKICAgIGZvcihsbCBpID0gMSA7IGkgPD0gbiA7IGkgKysgKSBjaW4+Pm5vZGVWYWxbaV07Cn0KbGwgZmluZF9zZXQobGwgYSApIHsKICAgIHJldHVybiBsYWJbYV0gPCAwID8gYSA6IGxhYlthXSA9IGZpbmRfc2V0KGxhYlthXSkgOwp9CmJvb2wgdW5pb25fc2V0KGxsIHUsIGxsIHYgKSB7CiAgICB1ID0gZmluZF9zZXQodSkgOwogICAgdiA9ZmluZF9zZXQodikgOwogICAgaWYodSA9PSB2ICkgcmV0dXJuIGZhbHNlOwogICAgaWYobGFiW3VdID4gbGFiW3ZdKSBzd2FwKHUsIHYpOwogICAgbGFiW3VdICs9IGxhYlt2XSA7CiAgICBsYWJbdl0gPXUgIDsKICAgIHJldHVybiB0cnVlOwp9CnZvaWQgZGZzKGxsIHUsIGxsIHAgKSB7CiAgICBzelt1XSA9IDEgOwogICAgZm9yKGxsIHYgOiBhZGpbdV0pIHsKICAgICAgICBpZih2ICE9IHAgKSB7CiAgICAgICAgICAgIGhpZ2hbdl0gPSBoaWdoW3VdICsgMSA7CiAgICAgICAgICAgIHBhclt2XT0gdSA7CiAgICAgICAgICAgIGRmcyh2LCAgdSApOwogICAgICAgICAgICBzelt1XSArPSBzelt2XSA7CiAgICAgICAgfQogICAgfQp9CnZvaWQgaGxkKGxsIHUsbGwgcCApIHsKICAgIGlmKCFjaGFpbkhlYWRbY3VyY2hhaW5dKSB7CiAgICAgICAgY2hhaW5IZWFkW2N1cmNoYWluXSA9IHUgOwogICAgfQogICAgc3RbdV0gPSArKyB0aW1lZGZzOwogICAgdG91clt0aW1lZGZzXSA9IHUgOwogICAgY2hhaW5JRFt1XSA9IGN1cmNoYWluIDsKICAgIGxsIG54dCA9IDAgOwogICAgZm9yKGxsIHYgOiBhZGpbdV0pIHsKICAgICAgICBpZih2ID09IHAgKSBjb250aW51ZSA7CiAgICAgICAgaWYoIG54dCA9PTAgfHwgc3pbdl0gPnN6W254dF0gKSBueHQgPSB2OwogICAgfQogICAgaWYobnh0ICkgewogICAgICAgIGhsZChueHQsdSApIDsKICAgIH0KICAgIGZvcihsbCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYodiAhPXAgICYmIHYgIT0gbnh0KSB7CiAgICAgICAgICAgIGN1cmNoYWluICsrIDsKICAgICAgICAgICAgaGxkKHYsdSk7CiAgICAgICAgfQogICAgfQogICAgZmluW3VdID0gdGltZWRmcyA7Cn0KbGwgdHJ1eXZhbihsbCB1LGxsIHYgKSB7CiAgICBsbCBsY2EgPSBMQ0EodSwgdiksIHN1bSA9IDAgIDsKICAgIHdoaWxlKGNoYWluSURbdV0gIT0gY2hhaW5JRFtsY2FdKSB7CiAgICAgICAgc3VtICs9IHNlZy5nZXQoMSwgIDEsICBuLCBzdFtjaGFpbkhlYWRbY2hhaW5JRFt1XV1dLCBzdFt1XSkgOwogICAgICAgIHUgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdV1dXSA7CiAgICB9CiAgICB3aGlsZShjaGFpbklEW3ZdICE9IGNoYWluSURbbGNhXSkgewogICAgICAgIHN1bSArPSBzZWcuZ2V0KDEsICAxLCAgbiwgc3RbY2hhaW5IZWFkW2NoYWluSURbdl1dXSwgc3Rbdl0pIDsKICAgICAgICB2ID0gcGFyW2NoYWluSGVhZFtjaGFpbklEW3ZdXV0gOwogICAgfQogICAgaWYoaGlnaFt1XSA+IGhpZ2hbdl0gKSBzd2FwKHUsIHYpIDsKICAgIHJldHVybiBzdW0gKyBzZWcuZ2V0KDEsIDEsIG4sIHN0W3VdLCBzdFt2XSkgOwp9CnZvaWQgcHJlcGFyZSgpIHsKICAgIGNpbj4+IHEgOwogICAgbWVtc2V0KGxhYiwgLTEsIHNpemVvZiBsYWIgKSA7CiAgICBmb3IobGwgaSA9IDEgOyBpIDw9IHEgOyBpICsrICkgewogICAgICAgIHN0cmluZyB0ID0gIkPhuqNtIMahbiBjw6FjIGLhuqFuIMSRw6MgZMOgbmggdGjhu51pIGdpYW4gxJHhu41jIGNvZGUgY+G7p2EgbcOsbmgsIOODvijiiafilr3iiaYqKW8gLCB5w6p1ICEiIDsKICAgICAgICBsbCB4LCB5IDsKICAgICAgICBjaW4+PiB0ID4+IHggPj4geTsKICAgICAgICBpZih0WzBdID09ICdiJyApIHsKICAgICAgICAgICAgaWYodW5pb25fc2V0KHgsIHkpKSB7CiAgICAgICAgICAgICAgICBhZGpbeF0ucHVzaF9iYWNrKHkpIDsKICAgICAgICAgICAgICAgIGFkalt5XS5wdXNoX2JhY2soeCkgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHF1ZVtpXS50ID0gMCA7CgogICAgICAgIH0gZWxzZSBpZih0WzBdID09ICdwJykgewogICAgICAgICAgICBxdWVbaV0udCA9IDE7CiAgICAgICAgfSBlbHNlICB7CiAgICAgICAgICAgIHF1ZVtpXS50ID0gMiA7CiAgICAgICAgfQogICAgICAgIHF1ZVtpXS54ID0geCA7CiAgICAgICAgcXVlW2ldLnkgPSB5IDsKICAgIH0KICAgIGZvcihsbCBpID0gMTsgaSA8PSBuIDsgaSArKyApaWYoIXN6W2ldKWRmcyhpLCBpICk7CiAgICBtZW1zZXQobGFiLCAtMSwgc2l6ZW9mIGxhYiApIDsKICAgIGZvcihsbCBpID0gMTsgaSA8PSBuIDsgaSArKyApaWYoIXN0W2ldKWhsZChpLCBpICApOwogICAgc2VnLmJ1aWxkKDEsICAxLCBuICApIDsKfQp2b2lkIHNvbHZlKCkgey8vIDAgOiBicmlkZ2UgICAgLCAxIDogdXBkYXRlICAgLCAyIDogcXVlcnkgIDsKICAgIGZvcihsbCBpID0gMSA7IGkgPD0gcSA7IGkgKysgKSB7CiAgICAgICAgbGwgdSA9IHF1ZVtpXS54LCB2ID0gcXVlW2ldLnkgOwogICAgICAgIGlmKHF1ZVtpXS50ID09IDAgKSB7CiAgICAgICAgICAgIGlmKCF1bmlvbl9zZXQodSwgdiApICkgY291dDw8ICJubyIgPDwgZWwgOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvdXQ8PCJ5ZXMiIDw8IGVsIDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZihxdWVbaV0udCA9PSAxICkgewogICAgICAgICAgICBzZWcudXBkYXRlKDEsIDEsIG4sIHN0W3VdLCB2KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZihmaW5kX3NldCh1KSAhPSBmaW5kX3NldCh2ICkpIGNvdXQ8PCAiaW1wb3NzaWJsZSIgPDwgZWwgOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvdXQ8PHRydXl2YW4gKHUsIHYgICkgPDwgZWwgOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpfX1JPT1RfXyB7Ci8vICAgICBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7Ci8vICAgICBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwogICAgZmFzdDsKICAgIGluaXQoKTsKICAgIHByZXBhcmUoKSA7CiAgICBzb2x2ZSgpOwp9Cg==