Isaac_D6 @ 2024-01-13 21:35:32
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int MAXN=100005;
struct tree
{
int l,r,lazy,sum,mx;
}t[MAXN*4];
struct node
{
int next,to,w;
}e[MAXN*2];
int k,n,m,root,g[MAXN],res,w[MAXN],deep[MAXN],top[MAXN],head[MAXN],fa[MAXN],son[MAXN],size[MAXN],pos[MAXN],cnt;
int a[MAXN];
void add(int u,int v){ e[++k].to=v;e[k].next=head[u];head[u]=k;}
void dfs1(int u,int f,int d){
deep[u]=d; fa[u]=f; size[u]=1;
int mson=-114514;
for(int i=head[u];i>0;i=e[i].next){
int v=e[i].to;
if(v==f) continue;
dfs1(v,u,++d);
size[u]+=size[v];
if(size[v]>mson) son[u]=v,mson=size[v];
}
}
void dfs2(long long u,long long tp){
pos[u]=++cnt; a[cnt]=w[u]; top[u]=tp;
if(!son[u]) return ;
dfs2(son[u],tp);
for(long long i=head[u];i>0;i=e[i].next){
long long v=e[i].to;
if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
}
}
void upd(long long id,long long l,long long r, long long ad){
if(t[id].l>r || t[id].r<l) return;
if(t[id].l>=l && t[id].r<=r){
t[id].lazy=ad;
t[id].sum=(t[id].r-t[id].l+1)*ad;
return;
}
upd(id*2,l,r,ad); upd(id*2+1,l,r,ad);
t[id].sum=t[id*2].sum+t[id*2+1].sum;
t[id].mx=max(t[id*2].mx,t[id*2+1].mx);
}
long long qma(long long id , long long L , long long R)
{
if(t[id].l>R || t[id].r<L) return -1 ;
if(t[id].l>=L&&t[id].r<=R) return t[id].mx;
return max(qma(id*2,L,R),qma(id*2+1,L,R));
}
long long tmx(long long x,long long y){
long long ans=-1;
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
ans=max(qma(1,pos[top[x]],pos[x]),ans);
x=fa[top[x]];
}
if(deep[x]>deep[y])swap(x,y);
ans=max(ans,qma(1,pos[x],pos[y]));
return ans;
}
void build(long long id,long long l,long long r)
{
t[id].l=l; t[id].r=r;
if(l==r) {
t[id].sum=a[l]; t[id].mx=a[l];
return ;
}
long long mid=(l+r)>>1;
build(id*2,l,mid); build(id*2+1,mid+1,r);
t[id].sum=(t[id*2].sum+t[id*2+1].sum);
t[id].mx=max(t[id*2].mx,t[id*2+1].mx);
}
signed main(){
cin>>n;
long long x,y,z;
for(long long i=2;i<=n;i++) cin>>x>>y,add(x,y),add(y,x),cin>>w[x],g[x]=i;
string que;
dfs1(1,1,1);
dfs2(1,1);
build(1,1,n);
while(1)
{
cin>>que;
if(que.size()==5){
cin>>x>>y;
cout<<tmx(x,y)<<endl;
}
if(que.size()==6){
cin>>x>>y;
upd(1,pos[g[x]],pos[g[x]],y);
}
if(que.size()==4)
{
return 0;
}
}
return 0;
}