这个鬼玩意儿为什么会 CE 啊。
没有 Linux 虚拟机的我非常费解。
//stO zzh!!!
#include<bits/stdc++.h>
#define LL long long
#define Rep(i,x,y) for(int i = (x), stOxrj = (y); i<=stOxrj; ++i)
#define Irep(i,x,y) for(int i = (x), stOxrj = (y); i>=stOxrj; --i)
#define VEC vector<int>
#define IT iterator
#define pb push_back
#define il inline
#define ci const int&
#define fi first
#define se second
#define mp make_pair
#define PA pair<int, int>
using namespace std;
inline int read(){
int res = 0, flag = 1; char c = getchar();
while( c<'0' || c>'9' ) { if( c=='-' ) flag = -1; c = getchar(); }
while( c>='0' && c<='9' ) res = res * 10 + c - '0', c = getchar();
return res * flag;
}
const int N = 1e5 + 20, M = 4e5 + 20;
int n;
struct SEG{
#define ls rt<<1
#define rs rt<<1|1
#define mid (l + r >> 1)
LL sum[M]; int tag[M];
void Init(){ memset(tag, -1, sizeof(tag)); memset(sum, 0, sizeof(sum) ); }
void orz(int rt,int l,int r,int v){
sum[rt] = 1ll * v * (r - l + 1); tag[rt] = v;
}
void pd(int rt,int l,int r){
if( tag[rt]==-1 ) return ;
orz(ls, l, mid, tag[rt]), orz(rs, mid + 1, r, tag[rt]);
tag[rt] = -1;
}
void modif(int rt,int l,int r,int lef,int rig,int v){
if( lef<=l && r<=rig ) return orz(rt, l, r, v);
pd(rt, l, r);
if( lef<=mid ) modif(ls, l, mid, lef, rig, v);
if( rig>mid ) modif(rs, mid + 1, r, lef, rig, v);
sum[rt] = sum[ls] + sum[rs];
}
LL quer(int rt,int l,int r,int lef,int rig){
if( lef<=l && r<=rig ) return sum[rt];
pd(rt, l, r); int res = 0;
if( lef<=mid ) res = quer(ls, l, mid, lef, rig);
if( rig>mid ) res += quer(rs, mid + 1, r, lef, rig);
return res;
}
void M(int l,int r,int v){
if( 1<=l && l<=r && r<=n ) modif(1, 1, n, l, r, v);
}
LL Q(int l,int r){
if( 1<=l && l<=r && r<=n ) return quer(1, 1, n, l, r);
return 0;
}
}T1, T2;
VEC e[N]; void add(int u,int v){ e[u].pb(v); }
int dfn[N],fa[N],dep[N],top[N],sz[N],son[N],dtime;
void dfs1(int u,int fat){
sz[u] = 1; fa[u] = fat; dep[u] = dep[fat] + 1;
for(auto v:e[u]) if( v!=fat ){
dfs1(v, u); sz[u] += sz[v];
if( sz[v]>sz[son[u]] ) son[u] = v;
}
}
void dfs2(int u,int x){
dfn[u] = ++dtime;
top[u] = x;
if( son[u] ) dfs2(son[u], x);
for(auto v:e[u]) if( v!=son[u] && v!=fa[u] ) dfs2(v, v);
}
int ti[N];
void upd(int u,int v,int tim){
int fu = top[u], fv = top[v];
while( fu!=fv ){
if( dep[fu]<dep[fv] ) swap(fu, fv), swap(u, v);
T1.M(dfn[son[u]], dfn[son[u]], 0);
T1.M(dfn[fu], dfn[u], 1);
T2.M(dfn[fu], dfn[u], tim); ti[fu] = tim;
u = fa[fu]; fu = top[u];
}
if( dep[u]<dep[v] ) swap(u, v);
T1.M(dfn[son[u]], dfn[son[u]], 0);
T1.M(dfn[son[v]], dfn[u], 1);
if( top[v]!=v ) T1.M(dfn[v], dfn[v], 0);
T2.M(dfn[v], dfn[u], tim);
}
int ask(int u,int v){
int fu = top[u], fv = top[v], res = 0;
while( fu!=fv ){
if( dep[fu]<dep[fv] ) swap(u, v), swap(fu, fv);
res += T1.Q(dfn[son[fu]], dfn[u]);
if( T2.Q(dfn[fa[fu]], dfn[fa[fu]]) <= ti[fu])
if( T2.Q(dfn[fu], dfn[fu]) <= ti[fu] ) res++;
u = fa[fu]; fu = top[u];
}
if( dep[u]<dep[v] ) swap(u, v);
res += T1.Q(dfn[son[v]], dfn[u]);
return res;
}
void Solve(){
T1.Init(); T2.Init();
n = read(); int T = read();
Rep(i,0,n+2) e[i].clear(), dfn[i] = fa[i] = dep[i] = top[i] = sz[i] = son[i] = 0, ti[i] = -1;
dtime = 0;
Rep(i,1,n-1){
int u = read(), v = read();
add(u, v), add(v, u);
}
dfs1(1, 0), dfs2(1, 1);
Rep(i,1,T){
int op = read(), u = read(), v = read();
if( op==1 ) upd(u, v, i);
else printf("%d\n", ask(u, v) );
}
}
signed main(){
freopen("edge.in", "r", stdin);
freopen("edge.out", "w", stdout);
int T = read();
while( T-- ) Solve();
return 0;
}