树上差分
# include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+100;
struct Edge{
int to,w,next;
}edge[MAXN<<1];
int head[MAXN];
int tot=0;
void add(int u,int v,int w)
{
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
int fa[MAXN],f[MAXN],d[MAXN],v[MAXN];
vector<int> query[MAXN];
int T,n,m,t;
int Find(int x)
{
if(fa[x]!=x) fa[x]=Find(fa[x]);
return fa[x];
}
void add_query(int x,int y)
{
query[x].push_back(y);
query[y].push_back(x);
}
void Tarjan(int x)
{
v[x]=1;
for(int i=head[x];~i;i=edge[i].next){
Edge e=edge[i];
if(v[e.to]) continue;
Tarjan(e.to);
fa[e.to]=x;
}
for(int i=0;i<query[x].size();i++){
int y=query[x][i];
if(v[y]==2){
int lca=Find(y);
f[x]++,f[y]++,f[lca]-=2;
}
}
v[x]=2;
}
void dfs(int x,int fa)
{