#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INFLL = (1LL<<62);
struct Treap {
ll val, mn, mx;
int pr, sz;
bool rev;
Treap *l, *r;
Treap(ll v): val(v), mn(v), mx(v), pr(rand()), sz(1), rev(false), l(nullptr), r(nullptr) {}
};
int tsz(Treap* t){ return t? t->sz:0; }
void pull(Treap* t){
if(!t) return;
t->sz = 1 + tsz(t->l) + tsz(t->r);
t->mn = t->val;
t->mx = t->val;
if(t->l){ t->mn = min(t->mn, t->l->mn); t->mx = max(t->mx, t->l->mx); }
if(t->r){ t->mn = min(t->mn, t->r->mn); t->mx = max(t->mx, t->r->mx); }
}
void apply_rev(Treap* t){
if(!t) return;
t->rev ^= 1;
}
void push(Treap* t){
if(!t || !t->rev) return;
t->rev = false;
swap(t->l, t->r);
if(t->l) t->l->rev ^= 1;
if(t->r) t->r->rev ^= 1;
}
Treap* mergeTreap(Treap* a, Treap* b){
if(!a) return b;
if(!b) return a;
if(a->pr < b->pr){
push(a);
a->r = mergeTreap(a->r, b);
pull(a);
return a;
} else {
push(b);
b->l = mergeTreap(a, b->l);
pull(b);
return b;
}
}
void splitTreap(Treap* t, int k, Treap*& a, Treap*& b){
if(!t){ a=b=nullptr; return; }
push(t);
if(tsz(t->l) >= k){
splitTreap(t->l, k, a, t->l);
pull(t);
b = t;
} else {
splitTreap(t->r, k - tsz(t->l) - 1, t->r, b);
pull(t);
a = t;
}
}
int N,Q;
vector<vector<int>> adj;
vector<int> parentv, depthv, heavy, head, pos, szv, invpos;
int curPos=1;
vector<ll> weightv;
int dfs1(int v,int p){
parentv[v]=p;
depthv[v]= (p==-1?0:depthv[p]+1);
int size=1;
int maxc=0;
heavy[v]=-1;
for(int to: adj[v]){
if(to==p) continue;
int s = dfs1(to, v);
if(s>maxc){ maxc=s; heavy[v]=to; }
maxc = max(maxc, s);
size += s;
}
szv[v]=size;
return size;
}
void dfs2(int v,int h){
head[v]=h;
pos[v]=curPos;
invpos[curPos]=v;
curPos++;
if(heavy[v]!=-1) dfs2(heavy[v], h);
for(int to: adj[v]){
if(to==parentv[v] || to==heavy[v]) continue;
dfs2(to, to);
}
}
struct Seg { int l,r; bool rev; };
vector<Seg> getPathSegments(int u,int v){
vector<Seg> up, down;
while(head[u] != head[v]){
if(depthv[head[u]] >= depthv[head[v]]){
up.push_back({pos[head[u]], pos[u], true});
u = parentv[head[u]];
} else {
down.push_back({pos[head[v]], pos[v], false});
v = parentv[head[v]];
}
}
if(pos[u] <= pos[v]) up.push_back({pos[u], pos[v], false});
else up.push_back({pos[v], pos[u], true});
for(int i=(int)down.size()-1;i>=0;--i) up.push_back(down[i]);
return up;
}
Treap* root = nullptr;
ll range_min(int l,int r){
Treap *a,*b,*c;
splitTreap(root, r, a, b);
splitTreap(a, l-1, c, a);
ll ans = (a? a->mn : INFLL);
a = mergeTreap(c, a);
root = mergeTreap(a, b);
return ans;
}
ll range_max(int l,int r){
Treap *a,*b,*c;
splitTreap(root, r, a, b);
splitTreap(a, l-1, c, a);
ll ans = (a? a->mx : -INFLL);
a = mergeTreap(c, a);
root = mergeTreap(a, b);
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>N>>Q;
weightv.assign(N+1,0);
for(int i=1;i<=N;i++) cin>>weightv[i];
adj.assign(N+1, {});
for(int i=0;i<N-1;i++){
int u,v; cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
parentv.assign(N+1,-1);
depthv.assign(N+1,0);
heavy.assign(N+1,-1);
head.assign(N+1,0);
pos.assign(N+1,0);
szv.assign(N+1,0);
invpos.assign(N+2,0);
dfs1(1,-1);
dfs2(1,1);
root = nullptr;
for(int i=1;i<=N;i++){
Treap* node = new Treap(weightv[ invpos[i] ]);
root = mergeTreap(root, node);
}
while(Q--){
int type,u,v;
cin>>type>>u>>v;
if(type==1){
auto segs = getPathSegments(u,v);
ll ans = INFLL;
for(auto &s: segs){
ans = min(ans, range_min(s.l, s.r));
}
cout<<ans<<"\n";
} else if(type==2){
auto segs = getPathSegments(u,v);
ll ans = -INFLL;
for(auto &s: segs){
ans = max(ans, range_max(s.l, s.r));
}
cout<<ans<<"\n";
} else if(type==3){
auto pathSegs = getPathSegments(u,v);
int k = pathSegs.size();
vector<pair<int,int>> ranges;
ranges.reserve(k);
for(auto &s: pathSegs) ranges.push_back({s.l, s.r});
vector<pair<int,int>> uniq = ranges;
sort(uniq.begin(), uniq.end());
uniq.erase(unique(uniq.begin(), uniq.end()), uniq.end());
int m = uniq.size();
vector<Treap*> nonPath;
vector<Treap*> segsT;
Treap* cur = root;
int removed = 0;
for(int i=0;i<m;i++){
int l = uniq[i].first;
int r = uniq[i].second;
int len = r - l + 1;
int kidx = l - 1 - removed;
Treap *left, *rest;
splitTreap(cur, kidx, left, rest);
Treap *mid, *right;
splitTreap(rest, len, mid, right);
nonPath.push_back(left);
segsT.push_back(mid);
cur = right;
removed += len;
}
nonPath.push_back(cur);
unordered_map<int,int> idxmap;
for(int i=0;i<m;i++) idxmap[ uniq[i].first ] = i;
vector<Treap*> seqT;
seqT.reserve(k);
for(auto &ps: pathSegs){
int id = idxmap[ps.l];
Treap* tnode = segsT[id];
if(ps.rev) apply_rev(tnode);
seqT.push_back(tnode);
}
vector<Treap*> newSeq;
newSeq.resize(k);
for(int i=0;i<k;i++){
Treap* tmp = seqT[k-1 - i];
apply_rev(tmp);
newSeq[i] = tmp;
}
for(int i=0;i<k;i++){
auto &ps = pathSegs[i];
int id = idxmap[ps.l];
Treap* tnode = newSeq[i];
if(ps.rev) apply_rev(tnode);
segsT[id] = tnode;
}
Treap* res = nullptr;
for(int i=0;i<m;i++){
res = mergeTreap(res, nonPath[i]);
res = mergeTreap(res, segsT[i]);
}
res = mergeTreap(res, nonPath[m]);
root = res;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwpjb25zdCBsbCBJTkZMTCA9ICgxTEw8PDYyKTsKc3RydWN0IFRyZWFwIHsKICAgIGxsIHZhbCwgbW4sIG14OwogICAgaW50IHByLCBzejsKICAgIGJvb2wgcmV2OwogICAgVHJlYXAgKmwsICpyOwogICAgVHJlYXAobGwgdik6IHZhbCh2KSwgbW4odiksIG14KHYpLCBwcihyYW5kKCkpLCBzeigxKSwgcmV2KGZhbHNlKSwgbChudWxscHRyKSwgcihudWxscHRyKSB7fQp9OwppbnQgdHN6KFRyZWFwKiB0KXsgcmV0dXJuIHQ/IHQtPnN6OjA7IH0Kdm9pZCBwdWxsKFRyZWFwKiB0KXsKICAgIGlmKCF0KSByZXR1cm47CiAgICB0LT5zeiA9IDEgKyB0c3oodC0+bCkgKyB0c3oodC0+cik7CiAgICB0LT5tbiA9IHQtPnZhbDsKICAgIHQtPm14ID0gdC0+dmFsOwogICAgaWYodC0+bCl7IHQtPm1uID0gbWluKHQtPm1uLCB0LT5sLT5tbik7IHQtPm14ID0gbWF4KHQtPm14LCB0LT5sLT5teCk7IH0KICAgIGlmKHQtPnIpeyB0LT5tbiA9IG1pbih0LT5tbiwgdC0+ci0+bW4pOyB0LT5teCA9IG1heCh0LT5teCwgdC0+ci0+bXgpOyB9Cn0Kdm9pZCBhcHBseV9yZXYoVHJlYXAqIHQpewogICAgaWYoIXQpIHJldHVybjsKICAgIHQtPnJldiBePSAxOwp9CnZvaWQgcHVzaChUcmVhcCogdCl7CiAgICBpZighdCB8fCAhdC0+cmV2KSByZXR1cm47CiAgICB0LT5yZXYgPSBmYWxzZTsKICAgIHN3YXAodC0+bCwgdC0+cik7CiAgICBpZih0LT5sKSB0LT5sLT5yZXYgXj0gMTsKICAgIGlmKHQtPnIpIHQtPnItPnJldiBePSAxOwp9ClRyZWFwKiBtZXJnZVRyZWFwKFRyZWFwKiBhLCBUcmVhcCogYil7CiAgICBpZighYSkgcmV0dXJuIGI7CiAgICBpZighYikgcmV0dXJuIGE7CiAgICBpZihhLT5wciA8IGItPnByKXsKICAgICAgICBwdXNoKGEpOwogICAgICAgIGEtPnIgPSBtZXJnZVRyZWFwKGEtPnIsIGIpOwogICAgICAgIHB1bGwoYSk7CiAgICAgICAgcmV0dXJuIGE7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2goYik7CiAgICAgICAgYi0+bCA9IG1lcmdlVHJlYXAoYSwgYi0+bCk7CiAgICAgICAgcHVsbChiKTsKICAgICAgICByZXR1cm4gYjsKICAgIH0KfQp2b2lkIHNwbGl0VHJlYXAoVHJlYXAqIHQsIGludCBrLCBUcmVhcComIGEsIFRyZWFwKiYgYil7CiAgICBpZighdCl7IGE9Yj1udWxscHRyOyByZXR1cm47IH0KICAgIHB1c2godCk7CiAgICBpZih0c3oodC0+bCkgPj0gayl7CiAgICAgICAgc3BsaXRUcmVhcCh0LT5sLCBrLCBhLCB0LT5sKTsKICAgICAgICBwdWxsKHQpOwogICAgICAgIGIgPSB0OwogICAgfSBlbHNlIHsKICAgICAgICBzcGxpdFRyZWFwKHQtPnIsIGsgLSB0c3oodC0+bCkgLSAxLCB0LT5yLCBiKTsKICAgICAgICBwdWxsKHQpOwogICAgICAgIGEgPSB0OwogICAgfQp9CmludCBOLFE7CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gYWRqOwp2ZWN0b3I8aW50PiBwYXJlbnR2LCBkZXB0aHYsIGhlYXZ5LCBoZWFkLCBwb3MsIHN6diwgaW52cG9zOwppbnQgY3VyUG9zPTE7CnZlY3RvcjxsbD4gd2VpZ2h0djsKaW50IGRmczEoaW50IHYsaW50IHApewogICAgcGFyZW50dlt2XT1wOwogICAgZGVwdGh2W3ZdPSAocD09LTE/MDpkZXB0aHZbcF0rMSk7CiAgICBpbnQgc2l6ZT0xOwogICAgaW50IG1heGM9MDsKICAgIGhlYXZ5W3ZdPS0xOwogICAgZm9yKGludCB0bzogYWRqW3ZdKXsKICAgICAgICBpZih0bz09cCkgY29udGludWU7CiAgICAgICAgaW50IHMgPSBkZnMxKHRvLCB2KTsKICAgICAgICBpZihzPm1heGMpeyBtYXhjPXM7IGhlYXZ5W3ZdPXRvOyB9CiAgICAgICAgbWF4YyA9IG1heChtYXhjLCBzKTsKICAgICAgICBzaXplICs9IHM7CiAgICB9CiAgICBzenZbdl09c2l6ZTsKICAgIHJldHVybiBzaXplOwp9CnZvaWQgZGZzMihpbnQgdixpbnQgaCl7CiAgICBoZWFkW3ZdPWg7CiAgICBwb3Nbdl09Y3VyUG9zOwogICAgaW52cG9zW2N1clBvc109djsKICAgIGN1clBvcysrOwogICAgaWYoaGVhdnlbdl0hPS0xKSBkZnMyKGhlYXZ5W3ZdLCBoKTsKICAgIGZvcihpbnQgdG86IGFkalt2XSl7CiAgICAgICAgaWYodG89PXBhcmVudHZbdl0gfHwgdG89PWhlYXZ5W3ZdKSBjb250aW51ZTsKICAgICAgICBkZnMyKHRvLCB0byk7CiAgICB9Cn0Kc3RydWN0IFNlZyB7IGludCBsLHI7IGJvb2wgcmV2OyB9Owp2ZWN0b3I8U2VnPiBnZXRQYXRoU2VnbWVudHMoaW50IHUsaW50IHYpewogICAgdmVjdG9yPFNlZz4gdXAsIGRvd247CiAgICB3aGlsZShoZWFkW3VdICE9IGhlYWRbdl0pewogICAgICAgIGlmKGRlcHRodltoZWFkW3VdXSA+PSBkZXB0aHZbaGVhZFt2XV0pewogICAgICAgICAgICB1cC5wdXNoX2JhY2soe3Bvc1toZWFkW3VdXSwgcG9zW3VdLCB0cnVlfSk7CiAgICAgICAgICAgIHUgPSBwYXJlbnR2W2hlYWRbdV1dOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvd24ucHVzaF9iYWNrKHtwb3NbaGVhZFt2XV0sIHBvc1t2XSwgZmFsc2V9KTsKICAgICAgICAgICAgdiA9IHBhcmVudHZbaGVhZFt2XV07CiAgICAgICAgfQogICAgfQogICAgaWYocG9zW3VdIDw9IHBvc1t2XSkgdXAucHVzaF9iYWNrKHtwb3NbdV0sIHBvc1t2XSwgZmFsc2V9KTsKICAgIGVsc2UgdXAucHVzaF9iYWNrKHtwb3Nbdl0sIHBvc1t1XSwgdHJ1ZX0pOwogICAgZm9yKGludCBpPShpbnQpZG93bi5zaXplKCktMTtpPj0wOy0taSkgdXAucHVzaF9iYWNrKGRvd25baV0pOwogICAgcmV0dXJuIHVwOwp9ClRyZWFwKiByb290ID0gbnVsbHB0cjsKbGwgcmFuZ2VfbWluKGludCBsLGludCByKXsKICAgIFRyZWFwICphLCpiLCpjOwogICAgc3BsaXRUcmVhcChyb290LCByLCBhLCBiKTsKICAgIHNwbGl0VHJlYXAoYSwgbC0xLCBjLCBhKTsKICAgIGxsIGFucyA9IChhPyBhLT5tbiA6IElORkxMKTsKICAgIGEgPSBtZXJnZVRyZWFwKGMsIGEpOwogICAgcm9vdCA9IG1lcmdlVHJlYXAoYSwgYik7CiAgICByZXR1cm4gYW5zOwp9CmxsIHJhbmdlX21heChpbnQgbCxpbnQgcil7CiAgICBUcmVhcCAqYSwqYiwqYzsKICAgIHNwbGl0VHJlYXAocm9vdCwgciwgYSwgYik7CiAgICBzcGxpdFRyZWFwKGEsIGwtMSwgYywgYSk7CiAgICBsbCBhbnMgPSAoYT8gYS0+bXggOiAtSU5GTEwpOwogICAgYSA9IG1lcmdlVHJlYXAoYywgYSk7CiAgICByb290ID0gbWVyZ2VUcmVhcChhLCBiKTsKICAgIHJldHVybiBhbnM7Cn0KaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBjaW4+Pk4+PlE7CiAgICB3ZWlnaHR2LmFzc2lnbihOKzEsMCk7CiAgICBmb3IoaW50IGk9MTtpPD1OO2krKykgY2luPj53ZWlnaHR2W2ldOwogICAgYWRqLmFzc2lnbihOKzEsIHt9KTsKICAgIGZvcihpbnQgaT0wO2k8Ti0xO2krKyl7CiAgICAgICAgaW50IHUsdjsgY2luPj51Pj52OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KICAgIHBhcmVudHYuYXNzaWduKE4rMSwtMSk7CiAgICBkZXB0aHYuYXNzaWduKE4rMSwwKTsKICAgIGhlYXZ5LmFzc2lnbihOKzEsLTEpOwogICAgaGVhZC5hc3NpZ24oTisxLDApOwogICAgcG9zLmFzc2lnbihOKzEsMCk7CiAgICBzenYuYXNzaWduKE4rMSwwKTsKICAgIGludnBvcy5hc3NpZ24oTisyLDApOwogICAgZGZzMSgxLC0xKTsKICAgIGRmczIoMSwxKTsKICAgIHJvb3QgPSBudWxscHRyOwogICAgZm9yKGludCBpPTE7aTw9TjtpKyspewogICAgICAgIFRyZWFwKiBub2RlID0gbmV3IFRyZWFwKHdlaWdodHZbIGludnBvc1tpXSBdKTsKICAgICAgICByb290ID0gbWVyZ2VUcmVhcChyb290LCBub2RlKTsKICAgIH0KICAgIHdoaWxlKFEtLSl7CiAgICAgICAgaW50IHR5cGUsdSx2OwogICAgICAgIGNpbj4+dHlwZT4+dT4+djsKICAgICAgICBpZih0eXBlPT0xKXsKICAgICAgICAgICAgYXV0byBzZWdzID0gZ2V0UGF0aFNlZ21lbnRzKHUsdik7CiAgICAgICAgICAgIGxsIGFucyA9IElORkxMOwogICAgICAgICAgICBmb3IoYXV0byAmczogc2Vncyl7CiAgICAgICAgICAgICAgICBhbnMgPSBtaW4oYW5zLCByYW5nZV9taW4ocy5sLCBzLnIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0PDxhbnM8PCJcbiI7CiAgICAgICAgfSBlbHNlIGlmKHR5cGU9PTIpewogICAgICAgICAgICBhdXRvIHNlZ3MgPSBnZXRQYXRoU2VnbWVudHModSx2KTsKICAgICAgICAgICAgbGwgYW5zID0gLUlORkxMOwogICAgICAgICAgICBmb3IoYXV0byAmczogc2Vncyl7CiAgICAgICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCByYW5nZV9tYXgocy5sLCBzLnIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0PDxhbnM8PCJcbiI7CiAgICAgICAgfSBlbHNlIGlmKHR5cGU9PTMpewogICAgICAgICAgICBhdXRvIHBhdGhTZWdzID0gZ2V0UGF0aFNlZ21lbnRzKHUsdik7CiAgICAgICAgICAgIGludCBrID0gcGF0aFNlZ3Muc2l6ZSgpOwogICAgICAgICAgICB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gcmFuZ2VzOwogICAgICAgICAgICByYW5nZXMucmVzZXJ2ZShrKTsKICAgICAgICAgICAgZm9yKGF1dG8gJnM6IHBhdGhTZWdzKSByYW5nZXMucHVzaF9iYWNrKHtzLmwsIHMucn0pOwogICAgICAgICAgICB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gdW5pcSA9IHJhbmdlczsKICAgICAgICAgICAgc29ydCh1bmlxLmJlZ2luKCksIHVuaXEuZW5kKCkpOwogICAgICAgICAgICB1bmlxLmVyYXNlKHVuaXF1ZSh1bmlxLmJlZ2luKCksIHVuaXEuZW5kKCkpLCB1bmlxLmVuZCgpKTsKICAgICAgICAgICAgaW50IG0gPSB1bmlxLnNpemUoKTsKICAgICAgICAgICAgdmVjdG9yPFRyZWFwKj4gbm9uUGF0aDsKICAgICAgICAgICAgdmVjdG9yPFRyZWFwKj4gc2Vnc1Q7CiAgICAgICAgICAgIFRyZWFwKiBjdXIgPSByb290OwogICAgICAgICAgICBpbnQgcmVtb3ZlZCA9IDA7CiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bTtpKyspewogICAgICAgICAgICAgICAgaW50IGwgPSB1bmlxW2ldLmZpcnN0OwogICAgICAgICAgICAgICAgaW50IHIgPSB1bmlxW2ldLnNlY29uZDsKICAgICAgICAgICAgICAgIGludCBsZW4gPSByIC0gbCArIDE7CiAgICAgICAgICAgICAgICBpbnQga2lkeCA9IGwgLSAxIC0gcmVtb3ZlZDsKICAgICAgICAgICAgICAgIFRyZWFwICpsZWZ0LCAqcmVzdDsKICAgICAgICAgICAgICAgIHNwbGl0VHJlYXAoY3VyLCBraWR4LCBsZWZ0LCByZXN0KTsKICAgICAgICAgICAgICAgIFRyZWFwICptaWQsICpyaWdodDsKICAgICAgICAgICAgICAgIHNwbGl0VHJlYXAocmVzdCwgbGVuLCBtaWQsIHJpZ2h0KTsKICAgICAgICAgICAgICAgIG5vblBhdGgucHVzaF9iYWNrKGxlZnQpOwogICAgICAgICAgICAgICAgc2Vnc1QucHVzaF9iYWNrKG1pZCk7CiAgICAgICAgICAgICAgICBjdXIgPSByaWdodDsKICAgICAgICAgICAgICAgIHJlbW92ZWQgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vblBhdGgucHVzaF9iYWNrKGN1cik7CiAgICAgICAgICAgIHVub3JkZXJlZF9tYXA8aW50LGludD4gaWR4bWFwOwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPG07aSsrKSBpZHhtYXBbIHVuaXFbaV0uZmlyc3QgXSA9IGk7CiAgICAgICAgICAgIHZlY3RvcjxUcmVhcCo+IHNlcVQ7CiAgICAgICAgICAgIHNlcVQucmVzZXJ2ZShrKTsKICAgICAgICAgICAgZm9yKGF1dG8gJnBzOiBwYXRoU2Vncyl7CiAgICAgICAgICAgICAgICBpbnQgaWQgPSBpZHhtYXBbcHMubF07CiAgICAgICAgICAgICAgICBUcmVhcCogdG5vZGUgPSBzZWdzVFtpZF07CiAgICAgICAgICAgICAgICBpZihwcy5yZXYpIGFwcGx5X3Jldih0bm9kZSk7CiAgICAgICAgICAgICAgICBzZXFULnB1c2hfYmFjayh0bm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmVjdG9yPFRyZWFwKj4gbmV3U2VxOwogICAgICAgICAgICBuZXdTZXEucmVzaXplKGspOwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPGs7aSsrKXsKICAgICAgICAgICAgICAgIFRyZWFwKiB0bXAgPSBzZXFUW2stMSAtIGldOwogICAgICAgICAgICAgICAgYXBwbHlfcmV2KHRtcCk7CiAgICAgICAgICAgICAgICBuZXdTZXFbaV0gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGludCBpPTA7aTxrO2krKyl7CiAgICAgICAgICAgICAgICBhdXRvICZwcyA9IHBhdGhTZWdzW2ldOwogICAgICAgICAgICAgICAgaW50IGlkID0gaWR4bWFwW3BzLmxdOwogICAgICAgICAgICAgICAgVHJlYXAqIHRub2RlID0gbmV3U2VxW2ldOwogICAgICAgICAgICAgICAgaWYocHMucmV2KSBhcHBseV9yZXYodG5vZGUpOwogICAgICAgICAgICAgICAgc2Vnc1RbaWRdID0gdG5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVHJlYXAqIHJlcyA9IG51bGxwdHI7CiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bTtpKyspewogICAgICAgICAgICAgICAgcmVzID0gbWVyZ2VUcmVhcChyZXMsIG5vblBhdGhbaV0pOwogICAgICAgICAgICAgICAgcmVzID0gbWVyZ2VUcmVhcChyZXMsIHNlZ3NUW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXMgPSBtZXJnZVRyZWFwKHJlcywgbm9uUGF0aFttXSk7CiAgICAgICAgICAgIHJvb3QgPSByZXM7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0K