#include <iostream>
#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
typedef long long int ll;
vector<ll> adj[500001];
ll d[500001];//depth/level
ll it[500001];
ll tt[500001];
ll r[500001][2];//subtree[ii] range
ll l[500001];//leaf or not
vector<ll> qq[500001*2]; //a,b,time,sort_by,ans_order
ll co=-1;
ll cc,dd;
ll tree[2][500001*4];
ll lazy[2][500001*4];
/* si -> index of current node in segment tree[ii]
ss and se -> Starting and ending indexes of elements for
which current nodes stores sum.
us and ue -> starting and ending indexes of update query
diff -> which we need to add in the range us to ue */
ll n;
void update(ll si, ll ss,ll se,ll l, ll r, ll value,ll ii) {
for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
if (l&1) tree[ii][l++] += value;
if (r&1) tree[ii][--r] += value;
}
}
void update2(ll si, ll ss, ll se, ll us,
ll ue, ll diff,ll ii)
{
// If lazy[ii] value is non-zero for current node of segment
// tree[ii], then there are some pending updates. So we need
// to make sure that the pending updates are done before
// making new updates. Because this value may be used by
// parent after recursive calls (See last line of this
// function)
if (lazy[ii][si] != 0)
{
// Make pending updates using value stored in lazy[ii]
// nodes
tree[ii][si] += (se-ss+1)*lazy[ii][si];
// checking if it is not leaf node because if
// it is leaf node then we cannot go further
if (ss != se)
{
// We can postpone updating children we don't
// need their new values now.
// Since we are not yet updating children of si,
// we need to set lazy[ii] flags for the children
lazy[ii][si*2 + 1] += lazy[ii][si];
lazy[ii][si*2 + 2] += lazy[ii][si];
}
// Set the lazy[ii] value for current node as 0 as it
// has been updated
lazy[ii][si] = 0;
}
// out of range
if (ss>se || ss>ue || se<us)
return ;
// Current segment is fully in range
if (ss>=us && se<=ue)
{
// Add the difference to current node
tree[ii][si] += (se-ss+1)*diff;
// same logic for checking leaf node or not
if (ss != se)
{
// This is where we store values in lazy[ii] nodes,
// rather than updating the segment tree[ii] itelf
// Since we don't need these updated values now
// we postpone updates by storing values in lazy[ii][]
lazy[ii][si*2 + 1] += diff;
lazy[ii][si*2 + 2] += diff;
}
return;
}
// If not completely in rang, but overlaps, recur for
// children,
ll mid = (ss+se)/2;
update(si*2+1, ss, mid, us, ue, diff,ii);
update(si*2+2, mid+1, se, us, ue, diff,ii);
// And use the result of children calls to update this
// node
tree[ii][si] = tree[ii][si*2+1] + tree[ii][si*2+2];
}
ll query(ll ss, ll se, ll p, ll qe, ll si,ll ii) {
ll res = 0;
for (p+=n; p> 0; p>>= 1) res += tree[ii][p];
return res;
}
ll query2(ll ss, ll se, ll qs, ll qe, ll si,ll ii)
{
// If lazy[ii] flag is set for current node of segment tree[ii],
// then there are some pending updates. So we need to
// make sure that the pending updates are done before
// processing the sub sum query
if (lazy[ii][si] != 0)
{
// Make pending updates to this node. Note that this
// node represents sum of elements in arr[ss..se] and
// all these elements must be increased by lazy[ii][si]
tree[ii][si] += (se-ss+1)*lazy[ii][si];
// checking if it is not leaf node because if
// it is leaf node then we cannot go further
if (ss != se)
{
// Since we are not yet updating children os si,
// we need to set lazy[ii] values for the children
lazy[ii][si*2+1] += lazy[ii][si];
lazy[ii][si*2+2] += lazy[ii][si];
}
// unset the lazy[ii] value for current node as it has
// been updated
lazy[ii][si] = 0;
}
// Out of range
if (ss>se || ss>qe || se<qs)
return 0;
// At this poll we are sure that pending lazy[ii] updates
// are done for current node. So we can return value
// (same as it was for query in our previous post)
// If this segment lies in range
if (ss>=qs && se<=qe)
return tree[ii][si];
// If a part of this segment overlaps with the given
// range
ll mid = (ss + se)/2;
return query(ss, mid, qs, qe, 2*si+1,ii) +
query(mid+1, se, qs, qe, 2*si+2,ii);
}
ll e[500001];
void build(ll ss, ll se, ll si,ll ii)
{
if (ss > se)
return ;
if (ss == se)
{
if(1==1){tree[ii][si] = 0;}
else{tree[ii][si]=it[e[ss]];}//it[ss];
return;
}
ll mid = (ss + se)/2;
build(ss, mid, si*2+1,ii);
build(mid+1, se, si*2+2,ii);
tree[ii][si] = tree[ii][si*2 + 1] + tree[ii][si*2 + 2];
}
ll sort_by(const vector<ll>& a,const vector<ll>& b){
if(a[3]!=b[3]){
return a[3]<b[3];
}
return a[1]!=-1 and b[1]==-1;
}
void dfs(ll no,ll par,ll lev){
ll st=0;
ll i;
co++;
d[no]=lev;
r[no][0]=co;
e[co]=no;
for(ll j=0;j<adj[no].size();j++){
i=adj[no][j];
if(i==par){
continue;
}
st=1;
//tt[i]+=it[no];
dfs(i,no,lev+1);
}
if(st==0){
// tt[no]+=it[no];
l[no]=1;
}
else{
l[no]=0;
}
r[no][1]=co;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
tree[i][j]=0;
}
}
ll t,k,i,j,tot;
ll q;
ll a,b;
cin>>n>>q;
for(ll i=0;i<n;i++){
adj[i].clear();
}
for(ll i=0;i<n-1;i++){
cin>>a>>b;
a-=1;
b-=1;
adj[a].push_back(b);
adj[b].push_back(a);
}
for(ll i=0;i<n;i++){
// scanf("%i",&it[i]);
cin>>it[i];
}
dfs(0,-1,1);
char s;
ll x=0;
for(ll i=0;i<n;i++){
qq[q+i].push_back(i);
qq[q+i].push_back(it[i]);
qq[q+i].push_back(-1);
qq[q+i].push_back(-1-d[i]);
}
for(ll _=0;_<q;_++){
cin>>s;
if(s=='?'){
cin>>a;
qq[_].push_back(a-1);
qq[_].push_back(-1);
qq[_].push_back(_);
qq[_].push_back(_-d[a-1]);
qq[_].push_back(x);
x++;
}
else{
cin>>a>>b;
qq[_].push_back(a-1);
qq[_].push_back(b);
qq[_].push_back(_);
qq[_].push_back(_-d[a-1]);
}
}
ll ans[x];
//now to divide queries groups with sane 4th index and then seg tree
sort(qq,qq+q+n,sort_by);
ll prev=n+10;
vector<ll> cur;
vector<vector<ll>> rem;
/* for(ll i=0;i<n;i++){
cout<<e[i]<<" ";
}
cout<<endl;*/
/* for(ll i=0;i<q;i++){
for(ll j=0;j<qq[i].size();j++){
cout<<qq[i][j]<<" ";
}
cout<<endl;
}
for(ll i=0;i<n;i++){
cout<<d[i]<<" ";
}
cout<<endl;*/
for(ll i=0;i<q+n;i++){
cur=qq[i];
if(cur[3]!=prev and i>0){
for(ll j=0;j<rem.size();j++){
update(0,0,n-1,r[rem[j][0]][0],r[rem[j][0]][1],-rem[j][1],0);
}
rem.clear();
}
if(cur.size()==4){
cout<<r[cur[0]][0]<<" "<<r[cur[0]][1]<<" "<<cur[1]<<endl;
update(0,0,n-1,r[cur[0]][0],r[cur[0]][1],cur[1],0);
update(0,0,n-1,r[cur[0]][0],r[cur[0]][1],cur[1],1);
rem.push_back(cur);
}
else{
cout<<query(0,n-1,r[cur[0]][0],r[cur[0]][0],0,l[cur[0]])<<" "<<r[cur[0]][0]<<" "<<r[cur[0]][1]<<endl;
// for(ll kk=0;kk<4*n;kk++){
// cout<<tree[l[cur[0]]][kk]<<",";
// }
// cout<<endl;
ans[cur[4]]=query(0,n-1,r[cur[0]][0],r[cur[0]][0],0,l[cur[0]]);
}
prev=cur[3];
}
for(ll i=0;i<x;i++){
cout<<ans[i]<<endl;
}
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxzdGRpby5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgbGw7CnZlY3RvcjxsbD4gYWRqWzUwMDAwMV07CgpsbCBkWzUwMDAwMV07Ly9kZXB0aC9sZXZlbApsbCBpdFs1MDAwMDFdOwpsbCB0dFs1MDAwMDFdOyAKbGwgcls1MDAwMDFdWzJdOy8vc3VidHJlZVtpaV0gcmFuZ2UKbGwgbFs1MDAwMDFdOy8vbGVhZiBvciBub3QKCgp2ZWN0b3I8bGw+IHFxWzUwMDAwMSoyXTsgIC8vYSxiLHRpbWUsc29ydF9ieSxhbnNfb3JkZXIKbGwgY289LTE7CmxsIGNjLGRkOwoKbGwgdHJlZVsyXVs1MDAwMDEqNF07CmxsIGxhenlbMl1bNTAwMDAxKjRdOwoKLyogIHNpIC0+IGluZGV4IG9mIGN1cnJlbnQgbm9kZSBpbiBzZWdtZW50IHRyZWVbaWldIAogICAgc3MgYW5kIHNlIC0+IFN0YXJ0aW5nIGFuZCBlbmRpbmcgaW5kZXhlcyBvZiBlbGVtZW50cyBmb3IgCiAgICAgICAgICAgICAgICAgd2hpY2ggY3VycmVudCBub2RlcyBzdG9yZXMgc3VtLiAKICAgIHVzIGFuZCB1ZSAtPiBzdGFydGluZyBhbmQgZW5kaW5nIGluZGV4ZXMgb2YgdXBkYXRlIHF1ZXJ5IAogICAgZGlmZiAtPiB3aGljaCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgcmFuZ2UgdXMgdG8gdWUgKi8KbGwgbjsKdm9pZCB1cGRhdGUobGwgc2ksIGxsIHNzLGxsIHNlLGxsIGwsIGxsIHIsIGxsIHZhbHVlLGxsIGlpKSB7CiAgZm9yIChsICs9IG4sIHIgKz0gbjsgbCA8IHI7IGwgPj49IDEsIHIgPj49IDEpIHsKICAgIGlmIChsJjEpIHRyZWVbaWldW2wrK10gKz0gdmFsdWU7CiAgICBpZiAociYxKSB0cmVlW2lpXVstLXJdICs9IHZhbHVlOwogIH0KfQoKdm9pZCB1cGRhdGUyKGxsIHNpLCBsbCBzcywgbGwgc2UsIGxsIHVzLCAKICAgICAgICAgICAgICAgICAgICAgbGwgdWUsIGxsIGRpZmYsbGwgaWkpIAp7IAogICAgLy8gSWYgbGF6eVtpaV0gdmFsdWUgaXMgbm9uLXplcm8gZm9yIGN1cnJlbnQgbm9kZSBvZiBzZWdtZW50IAogICAgLy8gdHJlZVtpaV0sIHRoZW4gdGhlcmUgYXJlIHNvbWUgcGVuZGluZyB1cGRhdGVzLiBTbyB3ZSBuZWVkIAogICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBlbmRpbmcgdXBkYXRlcyBhcmUgZG9uZSBiZWZvcmUgCiAgICAvLyBtYWtpbmcgbmV3IHVwZGF0ZXMuIEJlY2F1c2UgdGhpcyB2YWx1ZSBtYXkgYmUgdXNlZCBieSAKICAgIC8vIHBhcmVudCBhZnRlciByZWN1cnNpdmUgY2FsbHMgKFNlZSBsYXN0IGxpbmUgb2YgdGhpcyAKICAgIC8vIGZ1bmN0aW9uKSAKICAgIGlmIChsYXp5W2lpXVtzaV0gIT0gMCkgCiAgICB7IAogICAgICAgIC8vIE1ha2UgcGVuZGluZyB1cGRhdGVzIHVzaW5nIHZhbHVlIHN0b3JlZCBpbiBsYXp5W2lpXSAKICAgICAgICAvLyBub2RlcyAKICAgICAgICB0cmVlW2lpXVtzaV0gKz0gKHNlLXNzKzEpKmxhenlbaWldW3NpXTsgCiAgCiAgICAgICAgLy8gY2hlY2tpbmcgaWYgaXQgaXMgbm90IGxlYWYgbm9kZSBiZWNhdXNlIGlmIAogICAgICAgIC8vIGl0IGlzIGxlYWYgbm9kZSB0aGVuIHdlIGNhbm5vdCBnbyBmdXJ0aGVyIAogICAgICAgIGlmIChzcyAhPSBzZSkgCiAgICAgICAgeyAKICAgICAgICAgICAgLy8gV2UgY2FuIHBvc3Rwb25lIHVwZGF0aW5nIGNoaWxkcmVuIHdlIGRvbid0IAogICAgICAgICAgICAvLyBuZWVkIHRoZWlyIG5ldyB2YWx1ZXMgbm93LiAKICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCB5ZXQgdXBkYXRpbmcgY2hpbGRyZW4gb2Ygc2ksIAogICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHNldCBsYXp5W2lpXSBmbGFncyBmb3IgdGhlIGNoaWxkcmVuIAogICAgICAgICAgICBsYXp5W2lpXVtzaSoyICsgMV0gICArPSBsYXp5W2lpXVtzaV07IAogICAgICAgICAgICBsYXp5W2lpXVtzaSoyICsgMl0gICArPSBsYXp5W2lpXVtzaV07IAogICAgICAgIH0gCiAgCiAgICAgICAgLy8gU2V0IHRoZSBsYXp5W2lpXSB2YWx1ZSBmb3IgY3VycmVudCBub2RlIGFzIDAgYXMgaXQgCiAgICAgICAgLy8gaGFzIGJlZW4gdXBkYXRlZCAKICAgICAgICBsYXp5W2lpXVtzaV0gPSAwOyAKICAgIH0gCiAgCiAgICAvLyBvdXQgb2YgcmFuZ2UgCiAgICBpZiAoc3M+c2UgfHwgc3M+dWUgfHwgc2U8dXMpIAogICAgICAgIHJldHVybiA7IAogIAogICAgLy8gQ3VycmVudCBzZWdtZW50IGlzIGZ1bGx5IGluIHJhbmdlIAogICAgaWYgKHNzPj11cyAmJiBzZTw9dWUpIAogICAgeyAKICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgdG8gY3VycmVudCBub2RlIAogICAgICAgIHRyZWVbaWldW3NpXSArPSAoc2Utc3MrMSkqZGlmZjsgCiAgCiAgICAgICAgLy8gc2FtZSBsb2dpYyBmb3IgY2hlY2tpbmcgbGVhZiBub2RlIG9yIG5vdCAKICAgICAgICBpZiAoc3MgIT0gc2UpIAogICAgICAgIHsgCiAgICAgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgd2Ugc3RvcmUgdmFsdWVzIGluIGxhenlbaWldIG5vZGVzLCAKICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gdXBkYXRpbmcgdGhlIHNlZ21lbnQgdHJlZVtpaV0gaXRlbGYgCiAgICAgICAgICAgIC8vIFNpbmNlIHdlIGRvbid0IG5lZWQgdGhlc2UgdXBkYXRlZCB2YWx1ZXMgbm93IAogICAgICAgICAgICAvLyB3ZSBwb3N0cG9uZSB1cGRhdGVzIGJ5IHN0b3JpbmcgdmFsdWVzIGluIGxhenlbaWldW10gCiAgICAgICAgICAgIGxhenlbaWldW3NpKjIgKyAxXSAgICs9IGRpZmY7IAogICAgICAgICAgICBsYXp5W2lpXVtzaSoyICsgMl0gICArPSBkaWZmOyAKICAgICAgICB9IAogICAgICAgIHJldHVybjsgCiAgICB9IAogIAogICAgLy8gSWYgbm90IGNvbXBsZXRlbHkgaW4gcmFuZywgYnV0IG92ZXJsYXBzLCByZWN1ciBmb3IgCiAgICAvLyBjaGlsZHJlbiwgCiAgICBsbCBtaWQgPSAoc3Mrc2UpLzI7IAogICAgdXBkYXRlKHNpKjIrMSwgc3MsIG1pZCwgdXMsIHVlLCBkaWZmLGlpKTsgCiAgICB1cGRhdGUoc2kqMisyLCBtaWQrMSwgc2UsIHVzLCB1ZSwgZGlmZixpaSk7IAogIAogICAgLy8gQW5kIHVzZSB0aGUgcmVzdWx0IG9mIGNoaWxkcmVuIGNhbGxzIHRvIHVwZGF0ZSB0aGlzIAogICAgLy8gbm9kZSAKICAgIHRyZWVbaWldW3NpXSA9IHRyZWVbaWldW3NpKjIrMV0gKyB0cmVlW2lpXVtzaSoyKzJdOyAKfSAKCmxsIHF1ZXJ5KGxsIHNzLCBsbCBzZSwgbGwgcCwgbGwgcWUsIGxsIHNpLGxsIGlpKSAgewogIGxsIHJlcyA9IDA7CiAgZm9yIChwKz1uOyBwPiAwOyAgcD4+PSAxKSByZXMgKz0gdHJlZVtpaV1bcF07CiAgcmV0dXJuIHJlczsKfQpsbCBxdWVyeTIobGwgc3MsIGxsIHNlLCBsbCBxcywgbGwgcWUsIGxsIHNpLGxsIGlpKSAKeyAKICAgIC8vIElmIGxhenlbaWldIGZsYWcgaXMgc2V0IGZvciBjdXJyZW50IG5vZGUgb2Ygc2VnbWVudCB0cmVlW2lpXSwgCiAgICAvLyB0aGVuIHRoZXJlIGFyZSBzb21lIHBlbmRpbmcgdXBkYXRlcy4gU28gd2UgbmVlZCB0byAKICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBwZW5kaW5nIHVwZGF0ZXMgYXJlIGRvbmUgYmVmb3JlIAogICAgLy8gcHJvY2Vzc2luZyB0aGUgc3ViIHN1bSBxdWVyeSAKICAgIGlmIChsYXp5W2lpXVtzaV0gIT0gMCkgCiAgICB7IAogICAgICAgIC8vIE1ha2UgcGVuZGluZyB1cGRhdGVzIHRvIHRoaXMgbm9kZS4gTm90ZSB0aGF0IHRoaXMgCiAgICAgICAgLy8gbm9kZSByZXByZXNlbnRzIHN1bSBvZiBlbGVtZW50cyBpbiBhcnJbc3MuLnNlXSBhbmQgCiAgICAgICAgLy8gYWxsIHRoZXNlIGVsZW1lbnRzIG11c3QgYmUgaW5jcmVhc2VkIGJ5IGxhenlbaWldW3NpXSAKICAgICAgICB0cmVlW2lpXVtzaV0gKz0gKHNlLXNzKzEpKmxhenlbaWldW3NpXTsgCiAgCiAgICAgICAgLy8gY2hlY2tpbmcgaWYgaXQgaXMgbm90IGxlYWYgbm9kZSBiZWNhdXNlIGlmIAogICAgICAgIC8vIGl0IGlzIGxlYWYgbm9kZSB0aGVuIHdlIGNhbm5vdCBnbyBmdXJ0aGVyIAogICAgICAgIGlmIChzcyAhPSBzZSkgCiAgICAgICAgeyAKICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCB5ZXQgdXBkYXRpbmcgY2hpbGRyZW4gb3Mgc2ksIAogICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHNldCBsYXp5W2lpXSB2YWx1ZXMgZm9yIHRoZSBjaGlsZHJlbiAKICAgICAgICAgICAgbGF6eVtpaV1bc2kqMisxXSArPSBsYXp5W2lpXVtzaV07IAogICAgICAgICAgICBsYXp5W2lpXVtzaSoyKzJdICs9IGxhenlbaWldW3NpXTsgCiAgICAgICAgfSAKICAKICAgICAgICAvLyB1bnNldCB0aGUgbGF6eVtpaV0gdmFsdWUgZm9yIGN1cnJlbnQgbm9kZSBhcyBpdCBoYXMgCiAgICAgICAgLy8gYmVlbiB1cGRhdGVkIAogICAgICAgIGxhenlbaWldW3NpXSA9IDA7IAogICAgfSAKICAKICAgIC8vIE91dCBvZiByYW5nZSAKICAgIGlmIChzcz5zZSB8fCBzcz5xZSB8fCBzZTxxcykgCiAgICAgICAgcmV0dXJuIDA7IAogIAogICAgLy8gQXQgdGhpcyBwb2xsIHdlIGFyZSBzdXJlIHRoYXQgcGVuZGluZyBsYXp5W2lpXSB1cGRhdGVzIAogICAgLy8gYXJlIGRvbmUgZm9yIGN1cnJlbnQgbm9kZS4gU28gd2UgY2FuIHJldHVybiB2YWx1ZSAgCiAgICAvLyAoc2FtZSBhcyBpdCB3YXMgZm9yIHF1ZXJ5IGluIG91ciBwcmV2aW91cyBwb3N0KSAKICAKICAgIC8vIElmIHRoaXMgc2VnbWVudCBsaWVzIGluIHJhbmdlIAogICAgaWYgKHNzPj1xcyAmJiBzZTw9cWUpIAogICAgICAgIHJldHVybiB0cmVlW2lpXVtzaV07IAogIAogICAgLy8gSWYgYSBwYXJ0IG9mIHRoaXMgc2VnbWVudCBvdmVybGFwcyB3aXRoIHRoZSBnaXZlbiAKICAgIC8vIHJhbmdlIAogICAgbGwgbWlkID0gKHNzICsgc2UpLzI7IAogICAgcmV0dXJuIHF1ZXJ5KHNzLCBtaWQsIHFzLCBxZSwgMipzaSsxLGlpKSArIAogICAgICAgICAgIHF1ZXJ5KG1pZCsxLCBzZSwgcXMsIHFlLCAyKnNpKzIsaWkpOyAKfSAKICAKIGxsIGVbNTAwMDAxXTsKdm9pZCBidWlsZChsbCBzcywgbGwgc2UsIGxsIHNpLGxsIGlpKSAKeyAKICAgIGlmIChzcyA+IHNlKSAKICAgICAgICByZXR1cm4gOyAKCiAgICBpZiAoc3MgPT0gc2UpIAogICAgeyAKICAgICAgICBpZigxPT0xKXt0cmVlW2lpXVtzaV0gPSAwO30KICAgICAgICBlbHNle3RyZWVbaWldW3NpXT1pdFtlW3NzXV07fS8vaXRbc3NdOyAKICAgICAgICByZXR1cm47IAogICAgfSAKICAgIGxsIG1pZCA9IChzcyArIHNlKS8yOyAKICAgIGJ1aWxkKHNzLCBtaWQsIHNpKjIrMSxpaSk7IAogICAgYnVpbGQobWlkKzEsIHNlLCBzaSoyKzIsaWkpOyAKICAKICAgIHRyZWVbaWldW3NpXSA9IHRyZWVbaWldW3NpKjIgKyAxXSArIHRyZWVbaWldW3NpKjIgKyAyXTsgCn0gCiAgCmxsIHNvcnRfYnkoY29uc3QgdmVjdG9yPGxsPiYgYSxjb25zdCB2ZWN0b3I8bGw+JiBiKXsKCiAgICBpZihhWzNdIT1iWzNdKXsKICAgICAgICByZXR1cm4gYVszXTxiWzNdOwogICAgfQogICAgcmV0dXJuIGFbMV0hPS0xIGFuZCBiWzFdPT0tMTsKfQoKdm9pZCBkZnMobGwgbm8sbGwgcGFyLGxsIGxldil7CiAgICBsbCBzdD0wOwogICAgbGwgaTsKICAgIGNvKys7CiAgICBkW25vXT1sZXY7CiAgICAKICAgIHJbbm9dWzBdPWNvOwogICAgZVtjb109bm87CiAgICBmb3IobGwgaj0wO2o8YWRqW25vXS5zaXplKCk7aisrKXsKICAgICAgICBpPWFkaltub11bal07CiAgICAgICAgaWYoaT09cGFyKXsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHN0PTE7CiAgICAgICAgLy90dFtpXSs9aXRbbm9dOwogICAgICAgIGRmcyhpLG5vLGxldisxKTsKICAgIH0KICAgIGlmKHN0PT0wKXsKICAgICAvLyAgIHR0W25vXSs9aXRbbm9dOwogICAgICAgIGxbbm9dPTE7CiAgICB9CiAgICBlbHNlewogICAgICAgIGxbbm9dPTA7CiAgICB9CiAgICByW25vXVsxXT1jbzsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBmb3IoaW50IGk9MDtpPDI7aSsrKXsKCQlmb3IoaW50IGo9MDtqPDI7aisrKXsKCQkJdHJlZVtpXVtqXT0wOwoJCX0KCX0KICAgIGxsIHQsayxpLGosdG90OwogICAgbGwgcTsKICAgIGxsIGEsYjsKICAgIGNpbj4+bj4+cTsKICAgIGZvcihsbCBpPTA7aTxuO2krKyl7CiAgICAgICAgYWRqW2ldLmNsZWFyKCk7CiAgICB9CiAgICBmb3IobGwgaT0wO2k8bi0xO2krKyl7CiAgICAgICAgY2luPj5hPj5iOwogICAgICAgIGEtPTE7CiAgICAgICAgYi09MTsKICAgICAgICAKICAgICAgICBhZGpbYV0ucHVzaF9iYWNrKGIpOwogICAgICAgIGFkaltiXS5wdXNoX2JhY2soYSk7CiAgICB9CgogICAgZm9yKGxsIGk9MDtpPG47aSsrKXsKICAgIC8vCXNjYW5mKCIlaSIsJml0W2ldKTsKICAgICAgICBjaW4+Pml0W2ldOwogICAgfQogICAgCiAgICBkZnMoMCwtMSwxKTsKICAgIAogICAgY2hhciBzOyAKICAgIGxsIHg9MDsKICAgIGZvcihsbCBpPTA7aTxuO2krKyl7CiAgICAJcXFbcStpXS5wdXNoX2JhY2soaSk7CiAgICAJcXFbcStpXS5wdXNoX2JhY2soaXRbaV0pOwogICAgCXFxW3EraV0ucHVzaF9iYWNrKC0xKTsKICAgIAlxcVtxK2ldLnB1c2hfYmFjaygtMS1kW2ldKTsKICAgIH0KICAgCiAgICBmb3IobGwgXz0wO188cTtfKyspewogICAgICAgIGNpbj4+czsKCiAgICAgICAgaWYocz09Jz8nKXsKICAgICAgICAgICAgY2luPj5hOwogICAgICAgICAgICBxcVtfXS5wdXNoX2JhY2soYS0xKTsKICAgICAgICAgICAgcXFbX10ucHVzaF9iYWNrKC0xKTsKICAgICAgICAgICAgcXFbX10ucHVzaF9iYWNrKF8pOwogICAgICAgICAgICBxcVtfXS5wdXNoX2JhY2soXy1kW2EtMV0pOwogICAgICAgICAgICBxcVtfXS5wdXNoX2JhY2soeCk7CiAgICAgICAgICAgIHgrKzsKCiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGNpbj4+YT4+YjsKICAgICAgICAgICAgcXFbX10ucHVzaF9iYWNrKGEtMSk7CiAgICAgICAgICAgIHFxW19dLnB1c2hfYmFjayhiKTsKICAgICAgICAgICAgcXFbX10ucHVzaF9iYWNrKF8pOwogICAgICAgICAgICBxcVtfXS5wdXNoX2JhY2soXy1kW2EtMV0pOwogICAgICAgIH0KCiAgICB9CiAgICBsbCBhbnNbeF07Ci8vbm93IHRvIGRpdmlkZSBxdWVyaWVzIGdyb3VwcyB3aXRoIHNhbmUgNHRoIGluZGV4IGFuZCB0aGVuIHNlZyB0cmVlCiAgICBzb3J0KHFxLHFxK3Erbixzb3J0X2J5KTsKICAgIGxsIHByZXY9bisxMDsKICAgIHZlY3RvcjxsbD4gY3VyOwogICAgdmVjdG9yPHZlY3RvcjxsbD4+IHJlbTsKIC8qICAgZm9yKGxsIGk9MDtpPG47aSsrKXsKICAgIAljb3V0PDxlW2ldPDwiICI7CiAgICB9CiAgICBjb3V0PDxlbmRsOyovCiAgLyogIGZvcihsbCBpPTA7aTxxO2krKyl7CiAgICAJZm9yKGxsIGo9MDtqPHFxW2ldLnNpemUoKTtqKyspewogICAgCQljb3V0PDxxcVtpXVtqXTw8IiAiOwogICAgCX0KICAgIAljb3V0PDxlbmRsOwogICAgfQogICAgZm9yKGxsIGk9MDtpPG47aSsrKXsKICAgIAljb3V0PDxkW2ldPDwiICI7CiAgICAJCiAgICB9CiAgICBjb3V0PDxlbmRsOyovCiAgICAKICAgIGZvcihsbCBpPTA7aTxxK247aSsrKXsKICAgICAgICBjdXI9cXFbaV07CiAgICAgICAgaWYoY3VyWzNdIT1wcmV2IGFuZCBpPjApewogICAgICAgICAgICBmb3IobGwgaj0wO2o8cmVtLnNpemUoKTtqKyspewogICAgICAgICAgICAgICAgdXBkYXRlKDAsMCxuLTEscltyZW1bal1bMF1dWzBdLHJbcmVtW2pdWzBdXVsxXSwtcmVtW2pdWzFdLDApOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgCiAgICAgICAgaWYoY3VyLnNpemUoKT09NCl7CiAgICAgICAgCWNvdXQ8PHJbY3VyWzBdXVswXTw8IiAiPDxyW2N1clswXV1bMV08PCIgIjw8Y3VyWzFdPDxlbmRsOwogICAgICAgICAgICB1cGRhdGUoMCwwLG4tMSxyW2N1clswXV1bMF0scltjdXJbMF1dWzFdLGN1clsxXSwwKTsKICAgICAgICAgICAgdXBkYXRlKDAsMCxuLTEscltjdXJbMF1dWzBdLHJbY3VyWzBdXVsxXSxjdXJbMV0sMSk7CiAgICAgICAgICAgIHJlbS5wdXNoX2JhY2soY3VyKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgCWNvdXQ8PHF1ZXJ5KDAsbi0xLHJbY3VyWzBdXVswXSxyW2N1clswXV1bMF0sMCxsW2N1clswXV0pPDwiICI8PHJbY3VyWzBdXVswXTw8IiAiPDxyW2N1clswXV1bMV08PGVuZGw7CiAgICAgICAgLy8gICAgZm9yKGxsIGtrPTA7a2s8NCpuO2trKyspewogICAgICAgIC8vICAgIAljb3V0PDx0cmVlW2xbY3VyWzBdXV1ba2tdPDwiLCI7CiAgICAgICAgLy8gICAgfQogICAgICAgICAvLyAgIGNvdXQ8PGVuZGw7CiAgICAgICAgICAgIGFuc1tjdXJbNF1dPXF1ZXJ5KDAsbi0xLHJbY3VyWzBdXVswXSxyW2N1clswXV1bMF0sMCxsW2N1clswXV0pOwogICAgICAgIH0KICAgICAgICBwcmV2PWN1clszXTsKICAgICAgICAKICAgIH0KICAgIAogICAgZm9yKGxsIGk9MDtpPHg7aSsrKXsKICAgICAgICBjb3V0PDxhbnNbaV08PGVuZGw7CiAgICB9CiAgICAKICAgIAoJcmV0dXJuIDA7Cn0K