比赛 寒假集训2 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 轻重边 最终得分 100
用户昵称 zhyn 运行时间 6.473 s
代码语言 C++ 内存使用 14.95 MiB
提交时间 2026-02-25 12:20:09
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int t,n,m,tot;
int top[maxn],siz[maxn],son[maxn],f[maxn],dep[maxn],id[maxn];
int lt[maxn*4],rt[maxn*4],num[maxn*4],tag[maxn*4];
vector<int>e[maxn];
struct node{
	int l,r,s;
};
void init(){
    tot=0;
    for(int i=1;i<=n;i++){
        e[i].clear();
        son[i]=0;
    }
}
void dfs1(int u,int fa){
    f[u]=fa;
    dep[u]=dep[fa]+1;
    siz[u]=1;
    for(int v:e[u]){
        if(v==fa)continue;
        dfs1(v,u);
        siz[u]+=siz[v];
        if(siz[son[u]]<siz[v])son[u]=v;
    }
}
void dfs2(int u,int s){
    id[u]=++tot;
    top[u]=s;
    if(!son[u])return;
    dfs2(son[u],s);
    for(int v:e[u]){
        if(v==f[u]||v==son[u])continue;
        dfs2(v,v);
    }
}
void pushup(int u){
    lt[u]=lt[u*2];
    rt[u]=rt[u*2+1];
    num[u]=num[u*2]+num[u*2+1]+(rt[u*2]==lt[u*2+1]);
}
void pushdown(int u,int l,int r){
    if(tag[u]){
        int mid=(l+r)/2;
        tag[u*2]=tag[u*2+1]=tag[u];
        lt[u*2]=rt[u*2]=tag[u];
        lt[u*2+1]=rt[u*2+1]=tag[u];
        num[u*2]=mid-l;
        num[u*2+1]=r-mid-1;
        tag[u]=0;
    }
}
void build(int u,int l,int r){
    tag[u]=0;
    if(l==r){
        num[u]=0;
        lt[u]=rt[u]=-l;
        return;
    }
    int mid=(l+r)/2;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    pushup(u);
}
void update(int u,int l,int r,int ql,int qr,int v){
    if(l>=ql&&r<=qr){
        tag[u]=v;
        lt[u]=rt[u]=v;
        num[u]=r-l;
        return;
    }
    pushdown(u,l,r);
    int mid=(l+r)/2;
    if(ql<=mid)update(u*2,l,mid,ql,qr,v);
    if(qr>mid)update(u*2+1,mid+1,r,ql,qr,v);
    pushup(u);
}
node query(int u,int l,int r,int ql,int qr){
    if(l>=ql&&r<=qr)return {lt[u],rt[u],num[u]};
    pushdown(u,l,r);
    int mid=(l+r)/2;
    if(qr<=mid)return query(u*2,l,mid,ql,qr);
    if(ql>mid)return query(u*2+1,mid+1,r,ql,qr);
    node a=query(u*2,l,mid,ql,qr),b=query(u*2+1,mid+1,r,ql,qr);
    return {a.l,b.r,a.s+b.s+(a.r==b.l)};
}
int getval(int u,int l,int r,int p){
    if(l==r)return lt[u];
    pushdown(u,l,r);
    int mid=(l+r)/2;
    if(p<=mid)return getval(u*2,l,mid,p);
    return getval(u*2+1,mid+1,r,p);
}
void update_(int x,int y,int v){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        update(1,1,n,id[top[x]],id[x],v);
        x=f[top[x]];
    }
    if(dep[x]<dep[y])swap(x,y);
    update(1,1,n,id[y],id[x],v);
}
int query_(int x,int y){
    int res=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        node tmp=query(1,1,n,id[top[x]],id[x]);
        res+=tmp.s;
        if(tmp.l==getval(1,1,n,id[f[top[x]]]))res++;
        x=f[top[x]];
    }
    if(dep[x]<dep[y])swap(x,y);
    res+=query(1,1,n,id[y],id[x]).s;
    return res;
}
int main(){
	
	freopen("edge.in","r",stdin);
    freopen("edge.out","w",stdout);
    
    
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin>>t;
    while(t--){
        cin>>n>>m;
        init();
        for(int i=1,u,v;i<n;i++){
            cin>>u>>v;
            e[u].push_back(v);
            e[v].push_back(u);
        }
        dfs1(1,0);
        dfs2(1,1);
        build(1,1,n);
        int op,x,y;
        for(int i=1;i<=m;i++){
            cin>>op>>x>>y;
            if(op==1)update_(x,y,i);
            else cout<<query_(x,y)<<"\n";
        }
    }
    
    return 0;
}