/*
树的秘密.(secret.cpp/c/pas)
Prime最近在研究树这种奇怪的数据结构,他把树的意思向周边各位组的大神介绍了一遍:树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。
大神们表示不能理解这种奇怪的东西 ,然后Prime又耐心的解释了一遍的树的意思,Prime讲数据结构就好比张三丰教张无忌太极一样,每一遍都不一样!他这次是这样解释的:单个结点是一棵树,树根就是该结点本身。
设T1,T2,..,Tk是树,它们的根结点分别为n1,n2,..,nk。用一个新结点n作为n1,n2,..,nk的父亲,则得到一棵新树,结点n就是新树的根。我们称n1,n2,..,nk为一组兄弟结点,它们都是结点n的子结点。我们还称T1,T2,..,Tk为结点n的子树。
空集合也是树,称为空树。空树中没有结点。
好吧,大神们纷纷的懂了树的意思,于是好奇的他们每人给prime出了一个问题。
蕾蕾想知道树上任意两点之间的路径权值和是多少,他认为他期末考试的分数是这个和的1000倍!
陶爷,是一个文艺沉静的大神,他觉得树应有一种静美,所以他希望知道任意两点之间的路径中权值最大的一条边是什么,以便他写文章来讽刺这条边!
ZCJ是一个爱闹事的XAG逗比,他会不时的改变某一条的边的权值,但是他技术太弱,不会改变边所连是哪对节点。
树是在是一种神秘的数据结构,prime表示他参透不了其中的秘密!
这时Prime周围的tty,owaski,lyx,zxo以及众大神开始嘲讽prime太弱,肯定解决不了,是的Prime他好弱啥都不会,于是他把问题交给了大神您,谢谢你!
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <queue>
#include <set>
#include <map>
#define REP(I,A,B) for(int I=A,END=B;I<=END;I++)
#define REPD(I,A,B) for(int I=A,END=B;I>=END;I--)
#define RI(X) scanf("%d",&X)
#define RS(X) scanf("%s",&X)
#define GCH getchar()
#define PCH(X) putchar(X)
#define MAX(A,B) (((A)>(B))?(A):(B))
#define MIN(A,B) (((A)<(B))?(A):(B))
#define MS(X,Y) memset(X,Y,sizeof(X))
#define MC(X,Y,var,len) memcpy((X),(Y),sizeof(var)*(len))
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define MAXN 100005
struct line
{
int y;
int value;
int next;
}bian[MAXN*2]={0};
int head[MAXN]={0};
int fa[MAXN]={0};
struct node
{
int deep;
int fa;
int son;
int w;
int size;
int top;
}tree[MAXN]={0};
struct sg_tree
{
int lazy;
int max;
int sum;
}sg[MAXN*4]={0};
int n,m,tot=0;
using namespace std;
void open()
{
freopen("secret.in","r",stdin);
freopen("secret.out","w",stdout);
}
void close()
{
fclose(stdin);
fclose(stdout);
}
void add(int x,int y,int value)
{
tot++;
bian[tot].y=y;
bian[tot].value=value;
bian[tot].next=head[x];
head[x]=tot;
}
void init()
{
RI(n);
RI(m);
int x,y,value;
REP(i,1,n-1)
{
RI(x);
RI(y);
RI(value);
add(x,y,value);
add(y,x,value);
}
}
void dfs(int p)//求 deep fa size son
{
int i;
tree[p].size++;
for (i=head[p];i!=0;i=bian[i].next)
if (tree[bian[i].y].deep==0)
{
tree[bian[i].y].deep=tree[p].deep+1;
tree[bian[i].y].fa=p;
dfs(bian[i].y);
if (tree[tree[p].son].size<tree[bian[i].y].size)
{
tree[p].son=bian[i].y;
}
tree[p].size+=tree[bian[i].y].size;
}
}
void decomposition(int p)
{
int i;
if (tree[p].son!=0)
{
tree[tree[p].son].top=tree[p].top;
tot++;
tree[tree[p].son].w=tot;
decomposition(tree[p].son);
}
for (i=head[p];i!=0;i=bian[i].next)
if (tree[p].fa!=bian[i].y && tree[p].son!=bian[i].y)
{
tree[bian[i].y].top=bian[i].y;
tot++;
tree[bian[i].y].w=tot;
fa[tot]=bian[i].value;
decomposition(bian[i].y);
}
else if (tree[p].son==bian[i].y)
{
fa[tree[tree[p].son].w]=bian[i].value;
}
}
#define lc(p) (p*2)
#define rc(p) (p*2+1)
void down(int p,int l,int r)
{
int mid=(l+r)/2;
if (sg[p].lazy!=0)
{
sg[rc(p)].max=sg[lc(p)].max=sg[p].lazy;
sg[lc(p)].sum=(mid-l+1)*sg[p].lazy;
sg[rc(p)].sum=(r-mid)*sg[p].lazy;
sg[rc(p)].lazy=sg[lc(p)].lazy=sg[p].lazy;
sg[p].lazy=0;
}
}
void up(int p)
{
sg[p].max=max(sg[lc(p)].max,sg[rc(p)].max);
sg[p].sum=sg[lc(p)].sum+sg[rc(p)].sum;
}
void insert(int p,int l,int r,int ll,int rr,int value)
{
if (l==ll && r==rr)
{
sg[p].lazy=value;
sg[p].max=value;
sg[p].sum=(r-l+1)*value;
return ;
}
int mid=(l+r)/2;
down(p,l,r);
if (rr<=mid)
insert(lc(p),l,mid,ll,rr,value);
else if (mid<ll)
insert(rc(p),mid+1,r,ll,rr,value);
else
insert(lc(p),l,mid,ll,mid,value),insert(rc(p),mid+1,r,mid+1,rr,value);
up(p);
}
int squery(int p,int l,int r,int ll,int rr)
{
if (l==ll && r==rr)
{
return sg[p].sum;
}
int mid=(l+r)/2;
down(p,l,r);
if (rr<=mid)
return squery(lc(p),l,mid,ll,rr);
else if (mid<ll)
return squery(rc(p),mid+1,r,ll,rr);
else
return squery(lc(p),l,mid,ll,mid)+squery(rc(p),mid+1,r,mid+1,rr);
}
int mquery(int p,int l,int r,int ll,int rr)
{
if (l==ll && r==rr)
{
return sg[p].max;
}
int mid=(l+r)/2;
down(p,l,r);
if (rr<=mid)
return mquery(lc(p),l,mid,ll,rr);
else if (mid<ll)
return mquery(rc(p),mid+1,r,ll,rr);
else
return max(mquery(lc(p),l,mid,ll,mid),mquery(rc(p),mid+1,r,mid+1,rr));
}
void maketree()
{
REP(i,1,n)
insert(1,1,n,tree[i].w,tree[i].w,fa[tree[i].w]);
}
int sfind(int u,int v)
{
int fu=tree[u].top,fv=tree[v].top;
int sum=0;
while (fu!=fv)
{
if (tree[fu].deep<tree[fv].deep)
{
swap(u,v);
swap(fu,fv);
}
sum+=squery(1,1,n,tree[fu].w,tree[u].w);
u=tree[fu].fa;
fu=tree[u].top;
}
if (u==v) //已然是LCA
{
return sum;
}
else if (tree[u].deep>tree[v].deep)
{
swap(u,v);
}
return sum+squery(1,1,n,tree[tree[u].son].w,tree[v].w);
}
int mfind(int u,int v)
{
int fu=tree[u].top,fv=tree[v].top;
int tmp=0;
while (fu!=fv)
{
if (tree[fu].deep<tree[fv].deep)
{
swap(u,v);
swap(fu,fv);
}
tmp=max(tmp,mquery(1,1,n,tree[fu].w,tree[u].w));
u=tree[fu].fa;
fu=tree[u].top;
}
if (u==v)
{
return tmp;
}
else if (tree[u].deep>tree[v].deep)
{
swap(u,v);
}
return max(tmp,mquery(1,1,n,tree[tree[u].son].w,tree[v].w));
}
void change(int u,int v,int value)
{
int fu=tree[u].top,fv=tree[v].top;
while (fu!=fv)
{
if (tree[fu].deep<tree[fv].deep)
{
swap(u,v);
swap(fu,fv);
}
insert(1,1,n,tree[fu].w,tree[u].w,value);
u=tree[fu].fa;
fu=tree[u].top;
}
if (u==v)
{
return ;
}
else if (tree[u].deep>tree[v].deep)
{
swap(u,v);
}
insert(1,1,n,tree[tree[u].son].w,tree[v].w,value);
}
void work()
{
scanf("\n");
char way;
int x,y,value;
REP(_,1,m)
{
way=GCH;
GCH;
GCH;
RI(x);
RI(y);
if (way=='C')
{
RI(value);
change(x,y,value);
}
else if (way=='S')
{
printf("%d\n",sfind(x,y));
}
else
{
printf("%d\n",mfind(x,y));
}
GCH;
}
}
int main()
{
open();
init();
tree[1].deep=1;
dfs(1);
tot=0;
tot++;
tree[1].w=tot;
tree[1].top=1;
fa[1]=0;
decomposition(1);
maketree();
work();
close();
return 0;
}
LyoK5qCR55qE56eY5a+GLihzZWNyZXQuY3BwL2MvcGFzKQpQcmltZeacgOi/keWcqOeglOeptuagkei/meenjeWlh+aAqueahOaVsOaNrue7k+aehO+8jOS7luaKiuagkeeahOaEj+aAneWQkeWRqOi+ueWQhOS9jee7hOeahOWkp+elnuS7i+e7jeS6huS4gOmBje+8muagkeaYr+eUseaguee7k+eCueWSjOiLpeW5sumil+WtkOagkeaehOaIkOeahOOAguagkeaYr+eUseS4gOS4qumbhuWQiOS7peWPiuWcqOivpembhuWQiOS4iuWumuS5ieeahOS4gOenjeWFs+ezu+aehOaIkOeahOOAgumbhuWQiOS4reeahOWFg+e0oOensOS4uuagkeeahOe7k+eCue+8jOaJgOWumuS5ieeahOWFs+ezu+ensOS4uueItuWtkOWFs+ezu+OAgueItuWtkOWFs+ezu+WcqOagkeeahOe7k+eCueS5i+mXtOW7uueri+S6huS4gOS4quWxguasoee7k+aehOOAguWcqOi/meenjeWxguasoee7k+aehOS4reacieS4gOS4que7k+eCueWFt+acieeJueauiueahOWcsOS9je+8jOi/meS4que7k+eCueensOS4uuivpeagkeeahOaguee7k+eCue+8jOaIluensOS4uuagkeagueOAggrlpKfnpZ7ku6zooajnpLrkuI3og73nkIbop6Pov5nnp43lpYfmgKrnmoTkuJzopb8g77yM54S25ZCOUHJpbWXlj4jogJDlv4PnmoTop6Pph4rkuobkuIDpgY3nmoTmoJHnmoTmhI/mgJ3vvIxQcmltZeiusuaVsOaNrue7k+aehOWwseWlveavlOW8oOS4ieS4sOaVmeW8oOaXoOW/jOWkquaegeS4gOagt++8jOavj+S4gOmBjemDveS4jeS4gOagtyHku5bov5nmrKHmmK/ov5nmoLfop6Pph4rnmoTvvJrljZXkuKrnu5PngrnmmK/kuIDmo7XmoJHvvIzmoJHmoLnlsLHmmK/or6Xnu5PngrnmnKzouqvjgIIK6K6+VDEsVDIsLi4sVGvmmK/moJHvvIzlroPku6znmoTmoLnnu5PngrnliIbliKvkuLpuMSxuMiwuLixua+OAgueUqOS4gOS4quaWsOe7k+eCuW7kvZzkuLpuMSxuMiwuLixua+eahOeItuS6su+8jOWImeW+l+WIsOS4gOajteaWsOagke+8jOe7k+eCuW7lsLHmmK/mlrDmoJHnmoTmoLnjgILmiJHku6znp7BuMSxuMiwuLixua+S4uuS4gOe7hOWFhOW8n+e7k+eCue+8jOWug+S7rOmDveaYr+e7k+eCuW7nmoTlrZDnu5PngrnjgILmiJHku6zov5jnp7BUMSxUMiwuLixUa+S4uue7k+eCuW7nmoTlrZDmoJHjgIIK56m66ZuG5ZCI5Lmf5piv5qCR77yM56ew5Li656m65qCR44CC56m65qCR5Lit5rKh5pyJ57uT54K544CCCuWlveWQp++8jOWkp+elnuS7rOe6t+e6t+eahOaHguS6huagkeeahOaEj+aAne+8jOS6juaYr+WlveWlh+eahOS7luS7rOavj+S6uue7mXByaW1l5Ye65LqG5LiA5Liq6Zeu6aKY44CCCuiVvuiVvuaDs+efpemBk+agkeS4iuS7u+aEj+S4pOeCueS5i+mXtOeahOi3r+W+hOadg+WAvOWSjOaYr+WkmuWwke+8jOS7luiupOS4uuS7luacn+acq+iAg+ivleeahOWIhuaVsOaYr+i/meS4quWSjOeahDEwMDDlgI3vvIEK6Zm254i377yM5piv5LiA5Liq5paH6Im65rKJ6Z2Z55qE5aSn56We77yM5LuW6KeJ5b6X5qCR5bqU5pyJ5LiA56eN6Z2Z576O77yM5omA5Lul5LuW5biM5pyb55+l6YGT5Lu75oSP5Lik54K55LmL6Ze055qE6Lev5b6E5Lit5p2D5YC85pyA5aSn55qE5LiA5p2h6L655piv5LuA5LmI77yM5Lul5L6/5LuW5YaZ5paH56ug5p2l6K695Yi66L+Z5p2h6L6577yBClpDSuaYr+S4gOS4queIsemXueS6i+eahFhBR+mAl+avlCzku5bkvJrkuI3ml7bnmoTmlLnlj5jmn5DkuIDmnaHnmoTovrnnmoTmnYPlgLzvvIzkvYbmmK/ku5bmioDmnK/lpKrlvLHvvIzkuI3kvJrmlLnlj5jovrnmiYDov57mmK/lk6rlr7noioLngrnjgIIK5qCR5piv5Zyo5piv5LiA56eN56We56eY55qE5pWw5o2u57uT5p6E77yMcHJpbWXooajnpLrku5blj4LpgI/kuI3kuoblhbbkuK3nmoTnp5jlr4bvvIEK6L+Z5pe2UHJpbWXlkajlm7TnmoR0dHksb3dhc2tpLGx5eCx6eG/ku6Xlj4rkvJflpKfnpZ7lvIDlp4vlmLLorr1wcmltZeWkquW8se+8jOiCr+Wumuino+WGs+S4jeS6hu+8jOaYr+eahFByaW1l5LuW5aW95byx5ZWl6YO95LiN5Lya77yM5LqO5piv5LuW5oqK6Zeu6aKY5Lqk57uZ5LqG5aSn56We5oKo77yM6LCi6LCi5L2g77yBCgoqLwojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPG1hcD4KI2RlZmluZSBSRVAoSSxBLEIpIGZvcihpbnQgST1BLEVORD1CO0k8PUVORDtJKyspCiNkZWZpbmUgUkVQRChJLEEsQikgZm9yKGludCBJPUEsRU5EPUI7ST49RU5EO0ktLSkKI2RlZmluZSBSSShYKSBzY2FuZigiJWQiLCZYKQojZGVmaW5lIFJTKFgpIHNjYW5mKCIlcyIsJlgpCiNkZWZpbmUgR0NIIGdldGNoYXIoKQojZGVmaW5lIFBDSChYKSBwdXRjaGFyKFgpCiNkZWZpbmUgTUFYKEEsQikgKCgoQSk+KEIpKT8oQSk6KEIpKQojZGVmaW5lIE1JTihBLEIpICgoKEEpPChCKSk/KEEpOihCKSkKI2RlZmluZSBNUyhYLFkpIG1lbXNldChYLFksc2l6ZW9mKFgpKQojZGVmaW5lIE1DKFgsWSx2YXIsbGVuKSBtZW1jcHkoKFgpLChZKSxzaXplb2YodmFyKSoobGVuKSkKI2RlZmluZSBkZWJ1ZyguLi4pIGZwcmludGYoc3RkZXJyLF9fVkFfQVJHU19fKQojZGVmaW5lIE1BWE4gMTAwMDA1CnN0cnVjdCBsaW5lCnsKICBpbnQgeTsKICBpbnQgdmFsdWU7CiAgaW50IG5leHQ7Cn1iaWFuW01BWE4qMl09ezB9OwppbnQgaGVhZFtNQVhOXT17MH07CmludCBmYVtNQVhOXT17MH07CnN0cnVjdCBub2RlCnsKICBpbnQgZGVlcDsKICBpbnQgZmE7CiAgaW50IHNvbjsKICBpbnQgdzsKICBpbnQgc2l6ZTsKICBpbnQgdG9wOwp9dHJlZVtNQVhOXT17MH07CnN0cnVjdCBzZ190cmVlCnsKICBpbnQgbGF6eTsKICBpbnQgbWF4OwogIGludCBzdW07Cn1zZ1tNQVhOKjRdPXswfTsKaW50IG4sbSx0b3Q9MDsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdm9pZCBvcGVuKCkKewogIGZyZW9wZW4oInNlY3JldC5pbiIsInIiLHN0ZGluKTsKICBmcmVvcGVuKCJzZWNyZXQub3V0IiwidyIsc3Rkb3V0KTsKfQp2b2lkIGNsb3NlKCkKewogIGZjbG9zZShzdGRpbik7CiAgZmNsb3NlKHN0ZG91dCk7Cn0Kdm9pZCBhZGQoaW50IHgsaW50IHksaW50IHZhbHVlKQp7CiAgdG90Kys7CiAgYmlhblt0b3RdLnk9eTsKICBiaWFuW3RvdF0udmFsdWU9dmFsdWU7CiAgYmlhblt0b3RdLm5leHQ9aGVhZFt4XTsKICBoZWFkW3hdPXRvdDsKfQp2b2lkIGluaXQoKQp7CiAgUkkobik7CiAgUkkobSk7CiAgaW50IHgseSx2YWx1ZTsKICBSRVAoaSwxLG4tMSkKICB7CiAgICBSSSh4KTsKICAgIFJJKHkpOwogICAgUkkodmFsdWUpOwogICAgYWRkKHgseSx2YWx1ZSk7CiAgICBhZGQoeSx4LHZhbHVlKTsKICB9Cn0Kdm9pZCBkZnMoaW50IHApLy/msYIgZGVlcCBmYSBzaXplIHNvbiAKewogIGludCBpOwogIHRyZWVbcF0uc2l6ZSsrOwogIGZvciAoaT1oZWFkW3BdO2khPTA7aT1iaWFuW2ldLm5leHQpCiAgICBpZiAodHJlZVtiaWFuW2ldLnldLmRlZXA9PTApIAogICAgewogICAgICB0cmVlW2JpYW5baV0ueV0uZGVlcD10cmVlW3BdLmRlZXArMTsKICAgICAgdHJlZVtiaWFuW2ldLnldLmZhPXA7CiAgICAgIGRmcyhiaWFuW2ldLnkpOwogICAgICBpZiAodHJlZVt0cmVlW3BdLnNvbl0uc2l6ZTx0cmVlW2JpYW5baV0ueV0uc2l6ZSkKICAgICAgewoJICAgIHRyZWVbcF0uc29uPWJpYW5baV0ueTsKCSAgfQoJICB0cmVlW3BdLnNpemUrPXRyZWVbYmlhbltpXS55XS5zaXplOwogICAgfQp9CnZvaWQgZGVjb21wb3NpdGlvbihpbnQgcCkKewogIGludCBpOwogIGlmICh0cmVlW3BdLnNvbiE9MCkKICB7CiAgICB0cmVlW3RyZWVbcF0uc29uXS50b3A9dHJlZVtwXS50b3A7CiAgICB0b3QrKzsKICAgIHRyZWVbdHJlZVtwXS5zb25dLnc9dG90OwogICAgZGVjb21wb3NpdGlvbih0cmVlW3BdLnNvbik7CiAgfQogIGZvciAoaT1oZWFkW3BdO2khPTA7aT1iaWFuW2ldLm5leHQpCiAgICBpZiAodHJlZVtwXS5mYSE9YmlhbltpXS55ICYmIHRyZWVbcF0uc29uIT1iaWFuW2ldLnkpCiAgICB7CgkgIHRyZWVbYmlhbltpXS55XS50b3A9YmlhbltpXS55OwoJICB0b3QrKzsKCSAgdHJlZVtiaWFuW2ldLnldLnc9dG90OwoJICBmYVt0b3RdPWJpYW5baV0udmFsdWU7CgkgIGRlY29tcG9zaXRpb24oYmlhbltpXS55KTsKCX0KCWVsc2UgaWYgKHRyZWVbcF0uc29uPT1iaWFuW2ldLnkpCgl7CgkgIGZhW3RyZWVbdHJlZVtwXS5zb25dLnddPWJpYW5baV0udmFsdWU7Cgl9Cn0KI2RlZmluZSBsYyhwKSAocCoyKQojZGVmaW5lIHJjKHApIChwKjIrMSkKdm9pZCBkb3duKGludCBwLGludCBsLGludCByKQp7CiAgaW50IG1pZD0obCtyKS8yOwogICBpZiAoc2dbcF0ubGF6eSE9MCkKICAgewogICAgIHNnW3JjKHApXS5tYXg9c2dbbGMocCldLm1heD1zZ1twXS5sYXp5OwogICAgIHNnW2xjKHApXS5zdW09KG1pZC1sKzEpKnNnW3BdLmxhenk7CiAgICAgc2dbcmMocCldLnN1bT0oci1taWQpKnNnW3BdLmxhenk7CiAgICAgc2dbcmMocCldLmxhenk9c2dbbGMocCldLmxhenk9c2dbcF0ubGF6eTsKICAgICBzZ1twXS5sYXp5PTA7CiAgIH0KfQp2b2lkIHVwKGludCBwKQp7CiAgc2dbcF0ubWF4PW1heChzZ1tsYyhwKV0ubWF4LHNnW3JjKHApXS5tYXgpOwogIHNnW3BdLnN1bT1zZ1tsYyhwKV0uc3VtK3NnW3JjKHApXS5zdW07Cn0Kdm9pZCBpbnNlcnQoaW50IHAsaW50IGwsaW50IHIsaW50IGxsLGludCBycixpbnQgdmFsdWUpCnsKICBpZiAobD09bGwgJiYgcj09cnIpCiAgewogICAgc2dbcF0ubGF6eT12YWx1ZTsKICAgIHNnW3BdLm1heD12YWx1ZTsKICAgIHNnW3BdLnN1bT0oci1sKzEpKnZhbHVlOwogICAgcmV0dXJuIDsKICB9CiAgaW50IG1pZD0obCtyKS8yOwogIGRvd24ocCxsLHIpOwogIGlmIChycjw9bWlkKQogICAgaW5zZXJ0KGxjKHApLGwsbWlkLGxsLHJyLHZhbHVlKTsKICBlbHNlIGlmIChtaWQ8bGwpCiAgICBpbnNlcnQocmMocCksbWlkKzEscixsbCxycix2YWx1ZSk7CiAgZWxzZSAKICAgIGluc2VydChsYyhwKSxsLG1pZCxsbCxtaWQsdmFsdWUpLGluc2VydChyYyhwKSxtaWQrMSxyLG1pZCsxLHJyLHZhbHVlKTsKICB1cChwKTsKfQppbnQgc3F1ZXJ5KGludCBwLGludCBsLGludCByLGludCBsbCxpbnQgcnIpCnsKICBpZiAobD09bGwgJiYgcj09cnIpCiAgewogICAgcmV0dXJuIHNnW3BdLnN1bTsKICB9CiAgaW50IG1pZD0obCtyKS8yOwogIGRvd24ocCxsLHIpOwogIGlmIChycjw9bWlkKQogICAgcmV0dXJuIHNxdWVyeShsYyhwKSxsLG1pZCxsbCxycik7CiAgZWxzZSBpZiAobWlkPGxsKQogICAgcmV0dXJuIHNxdWVyeShyYyhwKSxtaWQrMSxyLGxsLHJyKTsKICBlbHNlCiAgICByZXR1cm4gc3F1ZXJ5KGxjKHApLGwsbWlkLGxsLG1pZCkrc3F1ZXJ5KHJjKHApLG1pZCsxLHIsbWlkKzEscnIpOwp9CmludCBtcXVlcnkoaW50IHAsaW50IGwsaW50IHIsaW50IGxsLGludCBycikKewogIGlmIChsPT1sbCAmJiByPT1ycikKICB7CiAgICByZXR1cm4gc2dbcF0ubWF4OwogIH0KICBpbnQgbWlkPShsK3IpLzI7CiAgZG93bihwLGwscik7CiAgaWYgKHJyPD1taWQpCiAgICByZXR1cm4gbXF1ZXJ5KGxjKHApLGwsbWlkLGxsLHJyKTsKICBlbHNlIGlmIChtaWQ8bGwpCiAgICByZXR1cm4gbXF1ZXJ5KHJjKHApLG1pZCsxLHIsbGwscnIpOwogIGVsc2UKICAgIHJldHVybiBtYXgobXF1ZXJ5KGxjKHApLGwsbWlkLGxsLG1pZCksbXF1ZXJ5KHJjKHApLG1pZCsxLHIsbWlkKzEscnIpKTsKfQp2b2lkIG1ha2V0cmVlKCkKewogIFJFUChpLDEsbikKICAgIGluc2VydCgxLDEsbix0cmVlW2ldLncsdHJlZVtpXS53LGZhW3RyZWVbaV0ud10pOwp9CmludCBzZmluZChpbnQgdSxpbnQgdikKewogIGludCBmdT10cmVlW3VdLnRvcCxmdj10cmVlW3ZdLnRvcDsKICBpbnQgc3VtPTA7CiAgd2hpbGUgKGZ1IT1mdikKICB7CiAgICBpZiAodHJlZVtmdV0uZGVlcDx0cmVlW2Z2XS5kZWVwKQogICAgewoJICBzd2FwKHUsdik7CgkgIHN3YXAoZnUsZnYpOwoJfQoJc3VtKz1zcXVlcnkoMSwxLG4sdHJlZVtmdV0udyx0cmVlW3VdLncpOwoJdT10cmVlW2Z1XS5mYTsKCWZ1PXRyZWVbdV0udG9wOwogIH0KICBpZiAodT09dikgLy/lt7LnhLbmmK9MQ0EKICB7CiAgICByZXR1cm4gc3VtOwogIH0gCiAgZWxzZSBpZiAodHJlZVt1XS5kZWVwPnRyZWVbdl0uZGVlcCkKICB7CiAgICBzd2FwKHUsdik7CiAgfQogIHJldHVybiBzdW0rc3F1ZXJ5KDEsMSxuLHRyZWVbdHJlZVt1XS5zb25dLncsdHJlZVt2XS53KTsKfQppbnQgbWZpbmQoaW50IHUsaW50IHYpCnsKICBpbnQgZnU9dHJlZVt1XS50b3AsZnY9dHJlZVt2XS50b3A7CiAgaW50IHRtcD0wOwogIHdoaWxlIChmdSE9ZnYpCiAgewogICAgaWYgKHRyZWVbZnVdLmRlZXA8dHJlZVtmdl0uZGVlcCkKICAgIHsKCSAgc3dhcCh1LHYpOwoJICBzd2FwKGZ1LGZ2KTsKCX0KCXRtcD1tYXgodG1wLG1xdWVyeSgxLDEsbix0cmVlW2Z1XS53LHRyZWVbdV0udykpOwoJdT10cmVlW2Z1XS5mYTsKCWZ1PXRyZWVbdV0udG9wOwogIH0KICBpZiAodT09dikKICB7CiAgICByZXR1cm4gdG1wOwogIH0KICBlbHNlIGlmICh0cmVlW3VdLmRlZXA+dHJlZVt2XS5kZWVwKQogIHsKICAgIHN3YXAodSx2KTsKICB9CiAgcmV0dXJuIG1heCh0bXAsbXF1ZXJ5KDEsMSxuLHRyZWVbdHJlZVt1XS5zb25dLncsdHJlZVt2XS53KSk7Cn0Kdm9pZCBjaGFuZ2UoaW50IHUsaW50IHYsaW50IHZhbHVlKQp7CiAgaW50IGZ1PXRyZWVbdV0udG9wLGZ2PXRyZWVbdl0udG9wOwogIHdoaWxlIChmdSE9ZnYpCiAgewogICAgaWYgKHRyZWVbZnVdLmRlZXA8dHJlZVtmdl0uZGVlcCkKICAgIHsKCSAgc3dhcCh1LHYpOwoJICBzd2FwKGZ1LGZ2KTsKCX0KCWluc2VydCgxLDEsbix0cmVlW2Z1XS53LHRyZWVbdV0udyx2YWx1ZSk7Cgl1PXRyZWVbZnVdLmZhOwoJZnU9dHJlZVt1XS50b3A7CiAgfQogIGlmICh1PT12KQogIHsKICAgIHJldHVybiA7CiAgfQogIGVsc2UgaWYgKHRyZWVbdV0uZGVlcD50cmVlW3ZdLmRlZXApCiAgewogICAgc3dhcCh1LHYpOwogIH0KICBpbnNlcnQoMSwxLG4sdHJlZVt0cmVlW3VdLnNvbl0udyx0cmVlW3ZdLncsdmFsdWUpOwp9CnZvaWQgd29yaygpCnsKICBzY2FuZigiXG4iKTsKICBjaGFyIHdheTsKICBpbnQgeCx5LHZhbHVlOwogIFJFUChfLDEsbSkKICB7CiAgICB3YXk9R0NIOwogICAgR0NIOwogICAgR0NIOwogICAgUkkoeCk7CiAgICBSSSh5KTsKICAgIGlmICh3YXk9PSdDJykKICAgIHsKCSAgUkkodmFsdWUpOwoJICBjaGFuZ2UoeCx5LHZhbHVlKTsKCX0KICAgIGVsc2UgaWYgKHdheT09J1MnKQogICAgewoJICBwcmludGYoIiVkXG4iLHNmaW5kKHgseSkpOwoJfQoJZWxzZQoJewoJICBwcmludGYoIiVkXG4iLG1maW5kKHgseSkpOwoJfQogICAgR0NIOwogIH0KfQppbnQgbWFpbigpCnsKICBvcGVuKCk7CiAgaW5pdCgpOwogIHRyZWVbMV0uZGVlcD0xOwogIGRmcygxKTsKICB0b3Q9MDsKICB0b3QrKzsKICB0cmVlWzFdLnc9dG90OwogIHRyZWVbMV0udG9wPTE7CiAgZmFbMV09MDsKICBkZWNvbXBvc2l0aW9uKDEpOwogIG1ha2V0cmVlKCk7CiAgd29yaygpOwogIGNsb3NlKCk7CiAgcmV0dXJuIDA7Cn0=