Not completed
#include <cstdio>
#include <iostream>
using namespace Std;
struct SS
{
int L,r,gai,jia,zhi;
} shu[400008];
int n,head[100005],next[200005],u[200005],v[200006],cnt=1,id[100005];
int deep[100005],size[100005],lc[100005][20],n1,dui[100005],lian[100005];
void Jiabian (int a1,int a2,int A3)
{
cnt++;
NEXT[CNT]=HEAD[A1];
head[a1]=cnt;
U[CNT]=A2;
V[CNT]=A3;
Return
}
void shu1 (int a1)
{
printf ("%d%d%d%d\n", Shu[a1].l,shu[a1].r,shu[a1].zhi,shu[a1].gai,shu[a1].jia);
if (SHU[A1].L==SHU[A1].R)
Return
SHU1 (a1*2);
SHU1 (a1*2+1);
Return
}
void gengxin (int a1)
{
if (SHU[A1].L==SHU[A1].R)
Return
if (shu[a1].gai!=-1)
{
shu[a1<<1].zhi=shu[a1<<1|1].zhi=shu[a1].gai;
shu[a1<<1].gai=shu[a1<<1|1].gai=shu[a1].gai;
shu[a1<<1].jia=shu[a1<<1|1].jia=0;
Shu[a1].gai=-1;
}
if (shu[a1].jia!=0)
{
Shu[a1*2].zhi+=shu[a1].jia;
if (shu[a1*2].gai==-1)
Shu[a1*2].jia+=shu[a1].jia;
Else
Shu[a1*2].gai+=shu[a1].jia;
if (shu[a1*2+1].gai==-1)
Shu[a1*2+1].jia+=shu[a1].jia;
Else
Shu[a1*2+1].gai+=shu[a1].jia;
shu[a1<<1|1].zhi+=shu[a1].jia;
shu[a1].jia=0;
}
}
void Xianjia (int a1,int a2,int a3,int a4)
{
if (SHU[A1].L>=A2&&SHU[A1].R<=A3)
{
SHU[A1].ZHI+=A4;
if (shu[a1].gai!=-1)
SHU[A1].GAI+=A4;
Else
SHU[A1].JIA+=A4;
Return
}
Gengxin (A1);
int mid= (SHU[A1].L+SHU[A1].R) >>1;
if (A2<=mid)
Xianjia (A1<<1,A2,A3,A4);
if (A3>mid)
Xianjia (A1<<1|1,A2,A3,A4);
Shu[a1].zhi=max (Shu[a1<<1].zhi,shu[a1<<1|1].zhi);
Return
}
void build (int a1,int a2,int A3)
{
SHU[A1].L=A2;
SHU[A1].R=A3;
Shu[a1].gai=-1;
if (A2==A3)
Return
int mid= (A2+A3) >>1;
Build (A1<<1,a2,mid);
Build (A1<<1|1,MID+1,A3);
Return
}
void dfs1 (int a1,int A2)
{
Size[a1]=1;
for (int i=1;i<=16;i++)
{
if (deep[a1]<1<<i)
Break
LC[A1][I]=LC[LC[A1][I-1]][I-1];
}
for (int i=head[a1];i;i=next[i])
if (U[I]!=A2)
{
deep[u[i]]=deep[a1]+1;
LC[U[I]][0]=A1;
DFS1 (U[I],A1);
Size[a1]+=size[u[i]];
}
Return
}
void dfs2 (int a1,int A2)
{
n1++;
DUI[A1]=N1;
LIAN[A1]=A2;
int k=0;
for (int i=head[a1];i;i=next[i])
if (Deep[a1]<deep[u[i]])
{
if (Size[u[i]]>size[k])
K=u[i];
}
Else
{
Xianjia (1,dui[a1],dui[a1],v[i]);
id[i>>1]=a1;
SHU1 (1);
printf ("\ n");
}
if (k==0)
Return
DFS2 (K,A2);
for (int i=head[a1];i;i=next[i])
if (Deep[a1]<deep[u[i]]&&k!=u[i])
DFS2 (U[i],u[i]);
}
int LCA (int a1,int A2)
{
if (DEEP[A1]<DEEP[A2])
Swap (A1,A2);
int T=DEEP[A1]-DEEP[A2];
for (int i=0;i<=16;i++)
if (t& (1<<i))
A1=lc[a1][i];
for (int i=16;i>=0;i--)
if (Lc[a1][i]!=lc[a2][i])
{
A1=lc[a1][i];
A2=lc[a2][i];
}
if (A1==A2)
return A1;
Else
return lc[a1][0];
}
void Lianjia (int a1,int a2,int A3)
{
for (; LIAN[A1]!=LIAN[A2];)
{
Xianjia (1,DUI[LIAN[A1]],DUI[A1],A3);
A1=LC[LIAN[A1]][0];
}
if (DUI[A2]+1<=DUI[A1])
Xianjia (1,DUI[A2]+1,DUI[A1],A3);
Return
}
void Xiangai (int a1,int a2,int a3,int a4)
{
if (SHU[A1].L>=A2&&SHU[A1].R<=A3)
{
SHU[A1].ZHI=A4;
SHU[A1].GAI=A4;
Return
}
Gengxin (A1);
int mid= (SHU[A1].L+SHU[A1].R) >>1;
if (A2<=mid)
Xiangai (A1<<1,A2,A3,A4);
if (A3>mid)
Xiangai (A1<<1|1,A2,A3,A4);
Shu[a1].zhi=max (Shu[a1<<1].zhi,shu[a1<<1|1].zhi);
Return
}
void Liangai (int a1,int a2,int A3)
{
for (; LIAN[A1]!=LIAN[A2];)
{
Xiangai (1,DUI[LIAN[A1]],DUI[A1],A3);
A1=LC[LIAN[A1]][0];
}
if (DUI[A2]+1<=DUI[A1])
Xiangai (1,DUI[A2]+1,DUI[A1],A3);
Return
}
int Xianmax (int a1,int a2,int A3)
{
if (SHU[A1].L>=A2&&SHU[A1].R<=A3)
return Shu[a1].zhi;
Gengxin (A1);
int mid= (SHU[A1].L+SHU[A1].R) >>1,ma=-2147483647;
if (A2<=mid)
Ma=max (Ma,xianmax (A1<<1,A2,A3));
if (A3>mid)
Ma=max (Ma,xianmax (A1<<1|1,A2,A3));
Return MA;
}
int Lianzhao (int a1,int A2)
{
int max1=-2147483647;
for (; LIAN[A1]!=LIAN[A2];)
{
Max1=max (Max1,xianmax (1,DUI[LIAN[A1]],DUI[A1));
A1=LC[LIAN[A1]][0];
}
if (DUI[A2]+1<=DUI[A1])
Max1=max (Max1,xianmax (1,DUI[A2]+1,DUI[A1));
return max1;
}
void Xunwen ()
{
Char ch[10];
for (; 1;)
{
int a1,a2,a3,t;
scanf ("%s", ch);
if (ch[1]== ' t ')
Return
scanf ("%d%d", &A1,&A2);
if (ch[1]== ' a ')
{
T=lca (A1,A2);
printf ("%d\n", Max (Lianzhao (a1,t), Lianzhao (a2,t)));
}
if (ch[1]== ' d ')
{
scanf ("%d", &a3);
T=lca (A1,A2);
printf ("%d%d\n", t,t);
Lianjia (A1,T,A3);
Lianjia (A2,T,A3);
}
if (ch[1]== ' O ')
{
scanf ("%d", &a3);
T=lca (A1,A2);
printf ("%d%d\n", t,t);
Liangai (A1,T,A3);
Liangai (A2,T,A3);
}
if (ch[1]== ' h ')
{
Xiangai (1,DUI[ID[A1]],DUI[ID[A1]],A2);
SHU1 (1);p rintf ("\ n");
}
}
}
int main ()
{
Freopen ("Sj.txt", "R", stdin);
Freopen ("1.txt", "w", stdout);
scanf ("%d", &n);
for (int i=0;i<n-1;i++)
{
int a1,a2,a3;
scanf ("%d%d%d", &A1,&A2,&A3);
Jiabian (A1,A2,A3);
Jiabian (A2,A1,A3);
}
Build (1,1,n);
DFS1 (1,0);
DFS2 (a);
Xunwen ();
}
Tree chain split Month Mao Jingxiu