#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+10;
const int inf=2e9;
int T,n,m,cnt,idx,c;
int siz[maxn],son[maxn],fa[maxn],dfn[maxn],dep[maxn],top[maxn],head[maxn];
struct node{
int v,nxt;
}e[maxn<<1];
struct vertex{
int l,r;
int le,re;
int sum,lazy;
}t[maxn<<2];
inline void add(int u,int v){
e[++cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline void ipt(){
cnt=idx=c=0;
n=read(),m=read();
for(register int i=1;i<=n;i++)head[i]=0;
for(register int i=1;i<n;i++){
int u,v;
u=read(),v=read();
add(u,v);
add(v,u);
}
}
inline void dfs1(int u){
son[u]=0;
siz[u]=1;
for(register int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==fa[u])continue;
fa[v]=u;
dep[v]=dep[u]+1;
dfs1(v);
siz[v]+=siz[u];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
inline void dfs2(int u,int rt){
++idx;
dfn[u]=idx;
top[u]=rt;
if(son[u]!=0)dfs2(son[u],rt);
for(register int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
inline void upd(int i){
t[i].sum=t[i<<1].sum+t[i<<1|1].sum;
if(t[i<<1].re==t[i<<1|1].le)t[i].sum++;
t[i].le=t[i<<1].le;
t[i].re=t[i<<1|1].re;
}
inline void build(int i,int l,int r){
t[i].l=l,t[i].r=r,t[i].lazy=-1;
if(l==r){
t[i].le=t[i].re=++c;
t[i].sum=0;
return ;
}
int mid=l+r>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
upd(i);
}
inline void pushdown(int i){
if(t[i].lazy!=-1){
t[i<<1].sum=t[i<<1].r-t[i<<1].l;
t[i<<1].lazy=t[i].lazy;
t[i<<1].le=t[i].lazy;
t[i<<1].re=t[i].lazy;
t[i<<1|1].sum=t[i<<1|1].r-t[i<<1|1].l;
t[i<<1|1].lazy=t[i].lazy;
t[i<<1|1].le=t[i].lazy;
t[i<<1|1].re=t[i].lazy;
t[i].lazy=-1;
}
return ;
}
inline void change(int i,int l,int r,int x){
if(t[i].l>r||t[i].r<l)return ;
if(l<=t[i].l&&t[i].r<=r){
t[i].sum=t[i].r-t[i].l;
t[i].lazy=x;
t[i].le=t[i].re=x;
return ;
}
pushdown(i);
change(i<<1,l,r,x);
change(i<<1|1,l,r,x);
upd(i);
}
inline vertex query(int i,int l,int r){
vertex nx,ny,x;
x.le=x.re=x.sum=x.lazy=inf;
if(t[i].l>r||t[i].r<l)return x;
if(l<=t[i].l&&t[i].r<=r)return t[i];
pushdown(i);
nx=query(i<<1,l,r);
ny=query(i<<1|1,l,r);
if(nx.le==inf){
if(ny.le==inf)return x;
return ny;
}
else {
if(ny.le==inf)return nx;
x.le=nx.le,x.re=ny.re;
x.sum=nx.sum+ny.sum;
if(nx.re==ny.le)x.sum++;
return x;
}
}
inline void change1(int x,int y,int w){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(1,dfn[top[x]],dfn[x],w);
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
change(1,dfn[y],dfn[x],w);
}
inline int query1(int x,int y){
int res=0;
vertex nx,ny;
nx.le=nx.re=nx.sum=ny.le=ny.re=ny.sum=inf;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y),swap(nx,ny);
vertex p=query(1,dfn[top[x]],dfn[x]);
res+=p.sum;
if(nx.le!=inf)
if(nx.le==p.re)res++;
x=fa[top[x]];
nx=p;
}
if(dep[x]<dep[y])swap(x,y),swap(nx,ny);
vertex p=query(1,dfn[y],dfn[x]);
res+=p.sum;
if(nx.le!=inf)
if(nx.le==p.re)res++;
if(ny.le!=inf)
if(ny.le==p.le)res++;
return res;
}
inline void solve(){
while(m--){
int op,x,y;
op=read(),x=read(),y=read();
if(op==1)change1(x,y,++c);
else printf("%d\n",query1(x,y));
}
}
signed main(){
// freopen("P7735.in","r",stdin);
// freopen("P7735.out","w",stdout);
// printf("I\n");
T=read();
printf("T = %lld\n",T);
for(int i=1;i<=T;i++){
ipt();
dfs1(1);
dfs2(1,1);
build(1,1,n);
solve();
}
return 0;
}
尝试下载了数据 结果文件啥也没输出