有数据吗wa了90’,或者大佬看看,(为什么不提供数据啊,我还以为是分数太低看不了,就交了一次题解,还是看不了数据!呜呜呜)
#include<iostream>
#include<cstdio>
using namespace std;
#define gc getchar
#define mn(a,b) ((a)<(b)?(a):(b))
#define mx(a,b) ((a)>(b)?(a):(b))
//#define int long long
int re(){
int s=0,a=0;char f=gc();
while(f<'0'||f>'9'){
a|=(f=='-');
f=gc();
}
while('0'<=f&&f<='9'){
s=s*10+f-'0';
f=gc();
}return a?-s:s;
}
#define N 210015
int n,m;
int fir[N],tot;
struct xy {
int v,nt;
}e[N<<1];
void add(int u,int v){
e[++tot]=(xy){
v,fir[u]
};fir[u]=tot;
}
int dfn[N],tl[N],tr[N],pre[N],ct[N],cl[N];
int sn[N],dh[N];
int x1,x2,x3;
bool fl[N];
#define vt e[i].v
#define pf printf
void dfs(int u){
int i,ax=0;cl[u]=1;
for(i=fir[u];i;i=e[i].nt)
if(vt!=pre[u]){
if(!fl[vt]){
pre[vt]=u;
fl[vt]=1;
dh[vt]=dh[u]+1;
dfs(vt);
cl[u]+=cl[vt];
if(cl[vt]>ax) sn[u]=vt,ax=cl[vt];
}else{
x1=u;x2=vt;x3=i>>1;
}
}
}
int tim;
int ddg(int u){
int i;dfn[u]=++tim;tr[u]=u;
if(u==sn[pre[u]]){
if(sn[u]){
tl[sn[u]]=tl[u];
tr[u]=ddg(sn[u]);
}
}else {
if(sn[u]) tl[sn[u]]=sn[u],ddg(sn[u]);
}
i=fir[u];
while(i>0){
if(vt!=pre[u]&&vt!=sn[u]&&
(!(u==x1&&vt==x2))&&
(!(u==x2&&vt==x1))
){
tl[vt]=vt;
ddg(vt);
}
i=e[i].nt;
}
return tr[u];
}
/*
4 5
1 2 11
1 3 12
2 3 13
1 4 15
2 2 3
1 2 1
2 2 3
2 2 4
2 3 4
*/
int pi[N];
void iol(int u,int x){
int i=dfn[u],nr=dfn[tr[u]];
while(i<=nr){
ct[i]+=x;
i+=(-i)&i;
}
}
int sol(int u){
int i=dfn[u],nl=dfn[tl[u]],s=0;
while(i>=nl){
s+=ct[i];
i-=(-i)&i;
}return s;
}
int wk(int x,int y){
int ans=0;
while(tl[x]!=tl[y]){
if(dh[x]<dh[y]) swap(x,y);
ans+=sol(x);
if(tl[x]!=x) x=tl[x];
else x=pre[x];
}if(dh[x]<dh[y]) swap(x,y);
int n1=sol(x),n2=sol(y);
ans+=n1-n2;
return ans;
}
signed main(){
n=re();
m=re();
int i;
int x,y,z;
for(i=1;i<=n;++i){
x=re();
y=re();
z=re();
add(x,n+i);add(n+i,y);
add(y,n+i);add(n+i,x);
pi[n+i]=z;
}
fl[1]=1;
dfs(1);
sn[0]=1;tl[1]=1;
ddg(1);
for(i=1;i<=n;++i)
iol(i+n,pi[n+i]);
int n1=99,n2=99,n3=99;
for(i=1;i<=m;++i){
z=re();
x=re();
y=re();
if(z==1){
if(x!=x3){
iol(n+x,-pi[n+x]);
iol(n+x,y);
}
pi[n+x]=y;
}
else{
n1=wk(x,y);
n2=wk(x,x1)+wk(y,x2)+pi[n+x3];
n3=wk(x,x2)+wk(y,x1)+pi[n+x3];
pf("%d\n",mn(n1,mn(n2,n3)));
}
}
return 0;
}