BZOJ1984: 月下“毛景树”
1984: 月下“毛景树”
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 713 Solved: 245
[Submit][Status]
Description
毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园。 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里。爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树”下面,发现树上长着他最爱吃的毛毛果~~~ “毛景树”上有N个节点和N-1条树枝,但节点上是没有毛毛果的,毛毛果都是长在树枝上的。但是这棵“毛景树”有着神奇的魔力,他能改变树枝上毛毛果的个数: Change k w:将第k条树枝上毛毛果的个数改变为w个。 Cover u v w:将节点u与节点v之间的树枝上毛毛果的个数都改变为w个。 Add u v w:将节点u与节点v之间的树枝上毛毛果的个数都增加w个。 由于毛毛虫很贪,于是他会有如下询问: Max u v:询问节点u与节点v之间树枝上毛毛果个数最多有多少个。
Input
第一行一个正整数N。 接下来N-1行,每行三个正整数Ui,Vi和Wi,第i+1行描述第i条树枝。表示第i条树枝连接节点Ui和节点Vi,树枝上有Wi个毛毛果。 接下来是操作和询问,以“Stop”结束。
Output
对于毛毛虫的每个询问操作,输出一个答案。
Sample Input
4
1 2 8
1 3 7
3 4 9
Max 2 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 2 4
Stop
1 2 8
1 3 7
3 4 9
Max 2 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 2 4
Stop
Sample Output
9
16
【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。
16
【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。
HINT
Source
题解:
先说点儿题外话
从8点钟开始我打算写树链剖分,因为转c++以来还没有写过。
抱着不好写、写完不好调、线段树不知能不能写对的心态开始写。
写了大概1个多小时写完。
然后就交bzoj,TLE,于是我把hzwer的程序拿过来对拍,写数据生成器又写了20分钟
第一组数据就发现我的程序死循环了,我就一直debug,而我又不会用gdb,
只能输中间结果来看看哪出错了,找到出错的位置又查哪儿导致的出错,调了差不多2个小时竟然发现是dfs1写错了
卧槽!更新fa[x]我竟然写到遍历节点后去了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
改了之后交上去就A了
我以为这题线段树是重点!!!
我以为写完代码读一遍就不会犯sb错误!!!
我以为树链剖分写过好几次了不会写错!!!
我的人生就浪费在debug上了嘛。。。。。。。。。
。。。。。。
题解就不说了,就是因为把边权捆到了点上所以我不得不写LCA,造成一堆麻烦
线段树大概想一想两种运算的优先级和pushdown、pushup放对位置就可以
代码:
1.伤痕累累的代码
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<queue> 11 #define inf 1000000000 12 #define maxn 100000+1000 13 #define maxm 500+100 14 #define eps 1e-10 15 #define ll long long 16 using namespace std; 17 struct edge{int go,next,w;}e[2*maxn]; 18 struct seg{int l,r,tag,add,mx;}t[4*maxn]; 19 int n,tot,cnt=0,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn]; 20 int fa[maxn][17],dep[maxn],head[maxn],son[maxn],s[maxn]; 21 void ins(int x,int y,int z) 22 { 23 e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot; 24 } 25 void insert(int x,int y,int z) 26 { 27 ins(x,y,z);ins(y,x,z); 28 } 29 void dfs(int x) 30 { 31 s[x]=1; 32 for(int i=1;i<=16;i++) 33 if((1<<i)<=dep[x]) 34 fa[x][i]=fa[fa[x][i-1]][i-1]; 35 else break; 36 for(int y=son[x]=0,i=head[x];i;i=e[i].next) 37 if(dep[y=e[i].go]==0) 38 { 39 dep[y]=dep[x]+1;fa[y][0]=x;dfs(y); 40 s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y; 41 } 42 } 43 void dfs2(int x,int chain) 44 { 45 p[x]=++cnt;top[x]=chain; 46 if(son[x])dfs2(son[x],chain); 47 for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 48 if(y!=fa[x][0]&&y!=son[x])dfs2(y,y); 49 } 50 void pushup(int k) 51 { 52 t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx); 53 } 54 void update1(int k,int x) 55 { 56 t[k].tag=x;t[k].add=0;t[k].mx=x; 57 } 58 void update2(int k,int x) 59 { 60 t[k].add+=x;t[k].mx+=x; 61 } 62 void pushdown(int k) 63 { 64 if(t[k].tag!=-1) 65 { 66 int x=t[k].tag; 67 update1(k<<1,x);update1(k<<1|1,x); 68 t[k].tag=-1; 69 } 70 if(t[k].add) 71 { 72 int x=t[k].add; 73 update2(k<<1,x);update2(k<<1|1,x); 74 t[k].add=0; 75 } 76 } 77 void build(int k,int x,int y) 78 { 79 int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>1; 80 t[k].tag=-1;t[k].add=0; 81 if(l==r){t[k].mx=v[l];return;} 82 build(k<<1,l,mid);build(k<<1|1,mid+1,r); 83 pushup(k); 84 } 85 void cover(int k,int x,int y,int z) 86 { 87 //cout<<k<<' '<<x<<' '<<y<<' '<<z<<endl; 88 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 89 if(l==x&&r==y){update1(k,z);return;} 90 pushdown(k); 91 if(y<=mid)cover(k<<1,x,y,z); 92 else if(x>mid)cover(k<<1|1,x,y,z); 93 else cover(k<<1,x,mid,z),cover(k<<1|1,mid+1,y,z); 94 pushup(k); 95 } 96 void addd(int k,int x,int y,int z) 97 { 98 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 99 if(l==x&&r==y){update2(k,z);return;} 100 pushdown(k); 101 if(y<=mid)addd(k<<1,x,y,z); 102 else if(x>mid)addd(k<<1|1,x,y,z); 103 else addd(k<<1,x,mid,z),addd(k<<1|1,mid+1,y,z); 104 pushup(k); 105 } 106 int query(int k,int x,int y) 107 { 108 //cout<<k<<' '<<x<<' '<<y<<endl; 109 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 110 if(l==x&&r==y)return t[k].mx; 111 pushdown(k); 112 if(y<=mid)return query(k<<1,x,y); 113 else if(x>mid)return query(k<<1|1,x,y); 114 else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y)); 115 } 116 int lca(int x,int y) 117 { 118 //cout<<"!!!!!!!"<<endl; 119 if(dep[x]<dep[y])swap(x,y);//cout<<"!!!!!!!"<<endl; 120 int t=dep[x]-dep[y]; 121 for(int i=0;i<=16;i++) 122 if(t&(1<<i))x=fa[x][i];//cout<<"!!!!!!!"<<endl; 123 if(x==y)return x; 124 for(int i=16;i>=0;i--) 125 if(fa[x][i]!=fa[y][i]) 126 {x=fa[x][i];y=fa[y][i];}; //cout<<"!!!!!!!"<<endl; 127 return fa[x][0]; 128 } 129 void solveadd(int x,int f,int z) 130 { 131 while(top[x]!=top[f]) 132 { 133 addd(1,p[top[x]],p[x],z); 134 x=fa[top[x]][0]; 135 } 136 if(f!=x)addd(1,p[f]+1,p[x],z); 137 } 138 void solvecover(int x,int f,int z) 139 { 140 while(top[x]!=top[f]) 141 { 142 cover(1,p[top[x]],p[x],z); 143 x=fa[top[x]][0]; 144 //cout<<"!!!!!"<<endl; 145 } 146 // cout<<"!!!!!!"<<endl; 147 // cout<<f<<' '<<x<<' '<<p[f]<<' '<<p[x]<<endl; 148 if(f!=x)cover(1,p[f]+1,p[x],z); 149 } 150 int solveask(int x,int f) 151 { 152 int ans=0; 153 while(top[x]!=top[f]) 154 { 155 //cout<<x<<' '<<top[x]<<' '<<p[x]<<' '<<p[top[x]]<<endl; 156 ans=max(ans,query(1,p[top[x]],p[x])); 157 x=fa[top[x]][0]; 158 } 159 if(f!=x)ans=max(ans,query(1,p[f]+1,p[x])); 160 return ans; 161 } 162 int main() 163 { 164 freopen("input.txt","r",stdin); 165 freopen("output.txt","w",stdout); 166 scanf("%d",&n); 167 for(int i=1;i<n;i++) 168 { 169 scanf("%d%d%d",&a[i],&b[i],&c[i]); 170 insert(a[i],b[i],c[i]); 171 } 172 dep[1]=1; 173 dfs(1); 174 // for(int i=1;i<=n;i++)cout<<i<<' '<<dep[i]<<endl; 175 dfs2(1,1); 176 for(int i=1;i<=n;i++) 177 // for(int j=0;j<=16;j++)cout<<i<<' '<<j<<' '<<fa[i][j]<<endl; 178 // for(int i=0;i<=n;i++)cout<<i<<' '<<top[i]<<' '<<p[i]<<' '<<son[i]<<endl; 179 v[1]=0; 180 for(int i=1;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i]; 181 for(int i=1;i<n;i++)v[p[id[i]]]=c[i]; 182 //for(int i=1;i<=n;i++)cout<<i<<' '<<v[i]<<' '<<id[i]<<' '<<p[i]<<endl; 183 184 build(1,1,n); 185 //for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].tag<<' '<<t[k].add<<' '<<t[k].mx<<endl; 186 char s[10]; 187 int x,y,z,f; 188 while(1) 189 { 190 //cout<<"!!!!!!!"<<endl; 191 //for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].tag<<' '<<t[k].add<<' '<<t[k].mx<<endl; 192 scanf("%s",s);//cout<<s<<endl; 193 switch(s[1]) 194 { 195 case 't':return 0;break; 196 case 'd':scanf("%d%d%d",&x,&y,&z);f=lca(x,y); 197 solveadd(x,f,z);solveadd(y,f,z);break; 198 case 'o':scanf("%d%d%d",&x,&y,&z);f=lca(x,y); 199 solvecover(x,f,z);solvecover(y,f,z); 200 break; 201 case 'h':scanf("%d%d",&x,&z);cover(1,p[id[x]],p[id[x]],z);break; 202 case 'a':scanf("%d%d",&x,&y);f=lca(x,y); 203 printf("%d\n",max(solveask(x,f),solveask(y,f))); 204 //cout<<solveask(x,f)<<' '<<solveask(y,f)<<endl; 205 break; 206 } 207 } 208 }
2.去掉调试
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<queue> 11 #define inf 1000000000 12 #define maxn 100000+1000 13 #define maxm 500+100 14 #define eps 1e-10 15 #define ll long long 16 using namespace std; 17 struct edge{int go,next,w;}e[2*maxn]; 18 struct seg{int l,r,tag,add,mx;}t[4*maxn]; 19 int n,tot,cnt=0,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn]; 20 int fa[maxn][17],dep[maxn],head[maxn],son[maxn],s[maxn]; 21 void ins(int x,int y,int z) 22 { 23 e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot; 24 } 25 void insert(int x,int y,int z) 26 { 27 ins(x,y,z);ins(y,x,z); 28 } 29 void dfs(int x) 30 { 31 s[x]=1; 32 for(int i=1;i<=16;i++) 33 if((1<<i)<=dep[x]) 34 fa[x][i]=fa[fa[x][i-1]][i-1]; 35 else break; 36 for(int y=son[x]=0,i=head[x];i;i=e[i].next) 37 if(dep[y=e[i].go]==0) 38 { 39 dep[y]=dep[x]+1;fa[y][0]=x;dfs(y); 40 s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y; 41 } 42 } 43 void dfs2(int x,int chain) 44 { 45 p[x]=++cnt;top[x]=chain; 46 if(son[x])dfs2(son[x],chain); 47 for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 48 if(y!=fa[x][0]&&y!=son[x])dfs2(y,y); 49 } 50 void pushup(int k) 51 { 52 t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx); 53 } 54 void update1(int k,int x) 55 { 56 t[k].tag=x;t[k].add=0;t[k].mx=x; 57 } 58 void update2(int k,int x) 59 { 60 t[k].add+=x;t[k].mx+=x; 61 } 62 void pushdown(int k) 63 { 64 if(t[k].tag!=-1) 65 { 66 int x=t[k].tag; 67 update1(k<<1,x);update1(k<<1|1,x); 68 t[k].tag=-1; 69 } 70 if(t[k].add) 71 { 72 int x=t[k].add; 73 update2(k<<1,x);update2(k<<1|1,x); 74 t[k].add=0; 75 } 76 } 77 void build(int k,int x,int y) 78 { 79 int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>1; 80 t[k].tag=-1;t[k].add=0; 81 if(l==r){t[k].mx=v[l];return;} 82 build(k<<1,l,mid);build(k<<1|1,mid+1,r); 83 pushup(k); 84 } 85 void cover(int k,int x,int y,int z) 86 { 87 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 88 if(l==x&&r==y){update1(k,z);return;} 89 pushdown(k); 90 if(y<=mid)cover(k<<1,x,y,z); 91 else if(x>mid)cover(k<<1|1,x,y,z); 92 else cover(k<<1,x,mid,z),cover(k<<1|1,mid+1,y,z); 93 pushup(k); 94 } 95 void addd(int k,int x,int y,int z) 96 { 97 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 98 if(l==x&&r==y){update2(k,z);return;} 99 pushdown(k); 100 if(y<=mid)addd(k<<1,x,y,z); 101 else if(x>mid)addd(k<<1|1,x,y,z); 102 else addd(k<<1,x,mid,z),addd(k<<1|1,mid+1,y,z); 103 pushup(k); 104 } 105 int query(int k,int x,int y) 106 { 107 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 108 if(l==x&&r==y)return t[k].mx; 109 pushdown(k); 110 if(y<=mid)return query(k<<1,x,y); 111 else if(x>mid)return query(k<<1|1,x,y); 112 else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y)); 113 } 114 int lca(int x,int y) 115 { 116 if(dep[x]<dep[y])swap(x,y); 117 int t=dep[x]-dep[y]; 118 for(int i=0;i<=16;i++) 119 if(t&(1<<i))x=fa[x][i]; 120 if(x==y)return x; 121 for(int i=16;i>=0;i--) 122 if(fa[x][i]!=fa[y][i]) 123 {x=fa[x][i];y=fa[y][i];}; 124 return fa[x][0]; 125 } 126 void solveadd(int x,int f,int z) 127 { 128 while(top[x]!=top[f]) 129 { 130 addd(1,p[top[x]],p[x],z); 131 x=fa[top[x]][0]; 132 } 133 if(f!=x)addd(1,p[f]+1,p[x],z); 134 } 135 void solvecover(int x,int f,int z) 136 { 137 while(top[x]!=top[f]) 138 { 139 cover(1,p[top[x]],p[x],z); 140 x=fa[top[x]][0]; 141 } 142 if(f!=x)cover(1,p[f]+1,p[x],z); 143 } 144 int solveask(int x,int f) 145 { 146 int ans=0; 147 while(top[x]!=top[f]) 148 { 149 ans=max(ans,query(1,p[top[x]],p[x])); 150 x=fa[top[x]][0]; 151 } 152 if(f!=x)ans=max(ans,query(1,p[f]+1,p[x])); 153 return ans; 154 } 155 int main() 156 { 157 freopen("input.txt","r",stdin); 158 freopen("output.txt","w",stdout); 159 scanf("%d",&n); 160 for(int i=1;i<n;i++) 161 { 162 scanf("%d%d%d",&a[i],&b[i],&c[i]); 163 insert(a[i],b[i],c[i]); 164 } 165 dep[1]=1; 166 dfs(1); 167 dfs2(1,1); 168 for(int i=1;i<=n;i++) 169 v[1]=0; 170 for(int i=1;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i]; 171 for(int i=1;i<n;i++)v[p[id[i]]]=c[i]; 172 build(1,1,n); 173 char s[10]; 174 int x,y,z,f; 175 while(1) 176 { 177 scanf("%s",s); 178 switch(s[1]) 179 { 180 case 't':return 0;break; 181 case 'd':scanf("%d%d%d",&x,&y,&z);f=lca(x,y); 182 solveadd(x,f,z);solveadd(y,f,z);break; 183 case 'o':scanf("%d%d%d",&x,&y,&z);f=lca(x,y); 184 solvecover(x,f,z);solvecover(y,f,z); 185 break; 186 case 'h':scanf("%d%d",&x,&z);cover(1,p[id[x]],p[id[x]],z);break; 187 case 'a':scanf("%d%d",&x,&y);f=lca(x,y); 188 printf("%d\n",max(solveask(x,f),solveask(y,f))); 189 break; 190 } 191 } 192 }
3.不求LCA也过了,哈哈。不过竟然只快了不到1秒钟QAQ
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<queue> 11 #define inf 1000000000 12 #define maxn 100000+1000 13 #define maxm 500+100 14 #define eps 1e-10 15 #define ll long long 16 using namespace std; 17 struct edge{int go,next,w;}e[2*maxn]; 18 struct seg{int l,r,tag,add,mx;}t[4*maxn]; 19 int n,tot,cnt=0,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn]; 20 int fa[maxn],dep[maxn],head[maxn],son[maxn],s[maxn]; 21 inline int read() 22 { 23 int x=0,f=1;char ch=getchar(); 24 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 25 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 26 return x*f; 27 } 28 void ins(int x,int y,int z) 29 { 30 e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot; 31 } 32 void insert(int x,int y,int z) 33 { 34 ins(x,y,z);ins(y,x,z); 35 } 36 void dfs(int x) 37 { 38 s[x]=1; 39 for(int y=son[x]=0,i=head[x];i;i=e[i].next) 40 if(dep[y=e[i].go]==0) 41 { 42 dep[y]=dep[x]+1;fa[y]=x;dfs(y); 43 s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y; 44 } 45 } 46 void dfs2(int x,int chain) 47 { 48 p[x]=++cnt;top[x]=chain; 49 if(son[x])dfs2(son[x],chain); 50 for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 51 if(y!=fa[x]&&y!=son[x])dfs2(y,y); 52 } 53 void pushup(int k) 54 { 55 t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx); 56 } 57 void update1(int k,int x) 58 { 59 t[k].tag=x;t[k].add=0;t[k].mx=x; 60 } 61 void update2(int k,int x) 62 { 63 t[k].add+=x;t[k].mx+=x; 64 } 65 void pushdown(int k) 66 { 67 if(t[k].tag!=-1) 68 { 69 int x=t[k].tag; 70 update1(k<<1,x);update1(k<<1|1,x); 71 t[k].tag=-1; 72 } 73 if(t[k].add) 74 { 75 int x=t[k].add; 76 update2(k<<1,x);update2(k<<1|1,x); 77 t[k].add=0; 78 } 79 } 80 void build(int k,int x,int y) 81 { 82 int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>1; 83 t[k].tag=-1;t[k].add=0; 84 if(l==r){t[k].mx=v[l];return;} 85 build(k<<1,l,mid);build(k<<1|1,mid+1,r); 86 pushup(k); 87 } 88 void cover(int k,int x,int y,int z) 89 { 90 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 91 if(l==x&&r==y){update1(k,z);return;} 92 pushdown(k); 93 if(y<=mid)cover(k<<1,x,y,z); 94 else if(x>mid)cover(k<<1|1,x,y,z); 95 else cover(k<<1,x,mid,z),cover(k<<1|1,mid+1,y,z); 96 pushup(k); 97 } 98 void addd(int k,int x,int y,int z) 99 { 100 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 101 if(l==x&&r==y){update2(k,z);return;} 102 pushdown(k); 103 if(y<=mid)addd(k<<1,x,y,z); 104 else if(x>mid)addd(k<<1|1,x,y,z); 105 else addd(k<<1,x,mid,z),addd(k<<1|1,mid+1,y,z); 106 pushup(k); 107 } 108 int query(int k,int x,int y) 109 { 110 int l=t[k].l,r=t[k].r,mid=(l+r)>>1; 111 if(l==x&&r==y)return t[k].mx; 112 pushdown(k); 113 if(y<=mid)return query(k<<1,x,y); 114 else if(x>mid)return query(k<<1|1,x,y); 115 else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y)); 116 } 117 void solveadd(int x,int y,int z) 118 { 119 while(top[x]!=top[y]) 120 { 121 if(dep[top[x]]<dep[top[y]])swap(x,y); 122 addd(1,p[top[x]],p[x],z); 123 x=fa[top[x]]; 124 } 125 if(dep[x]>dep[y])swap(x,y); 126 if(x!=y)addd(1,p[x]+1,p[y],z); 127 } 128 void solvecover(int x,int y,int z) 129 { 130 while(top[x]!=top[y]) 131 { 132 if(dep[top[x]]<dep[top[y]])swap(x,y); 133 cover(1,p[top[x]],p[x],z); 134 x=fa[top[x]]; 135 } 136 if(dep[x]>dep[y])swap(x,y); 137 if(x!=y)cover(1,p[x]+1,p[y],z); 138 } 139 int solveask(int x,int y) 140 { 141 int ans=0; 142 while(top[x]!=top[y]) 143 { 144 if(dep[top[x]]<dep[top[y]])swap(x,y); 145 ans=max(ans,query(1,p[top[x]],p[x])); 146 x=fa[top[x]]; 147 } 148 if(dep[x]>dep[y])swap(x,y); 149 if(x!=y)ans=max(ans,query(1,p[x]+1,p[y])); 150 return ans; 151 } 152 int main() 153 { 154 freopen("input.txt","r",stdin); 155 freopen("output.txt","w",stdout); 156 n=read(); 157 for(int i=1;i<n;i++) 158 { 159 a[i]=read();b[i]=read();c[i]=read(); 160 insert(a[i],b[i],c[i]); 161 } 162 dep[1]=1; 163 dfs(1); 164 dfs2(1,1); 165 for(int i=1;i<=n;i++) 166 v[1]=0; 167 for(int i=1;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i]; 168 for(int i=1;i<n;i++)v[p[id[i]]]=c[i]; 169 build(1,1,n); 170 char s[10]; 171 int x,y,z,f; 172 while(1) 173 { 174 scanf("%s",s); 175 switch(s[1]) 176 { 177 case 't':return 0;break; 178 case 'd':x=read();y=read();z=read(); 179 solveadd(x,y,z);break; 180 case 'o':x=read();y=read();z=read(); 181 solvecover(x,y,z); 182 break; 183 case 'h':x=read();z=read();cover(1,p[id[x]],p[id[x]],z);break; 184 case 'a':x=read();y=read(); 185 printf("%d\n",solveask(x,y)); 186 break; 187 } 188 } 189 }