注意到一操作。
因为我们建了双向边,所以他给的边的编号不一定是树边。
比如说我是这样建的边:
nxt[++tot]=head[u],head[u]=tot,to[tot]=v,w[tot]=W;
nxt[++tot]=head[v],head[v]=tot,to[tot]=u,w[tot]=W;
那对于一条无向边,树边可能是 2k−1,可能是 2k。操作时要特判一下。
怎么特判?树剖的时候我们不是求出了每个点的父亲了吗?那就用父亲判,看连续的两条边的终点的祖先关系。
if(op[1]=='h'){
scanf("%d%d",&u,&v);
if(fa[to[u<<1^1]]==to[u<<1])u=u<<1^1;
else u<<=1;
update1(1,n,1,dfn[to[u]],dfn[to[u]],v);
}