樹上亂搞





    想到其實只要收尾搞一搞其實就很水了。  
      
    #include<cstdio>  
    #include<algorithm>  
    #include<cstring>  
    #define fo(i,a,b) for(int i=a;i<=b;i++)  
    #define N 101000  
    using namespace std;  
    int n,tot=0,dfn[N],d[N],f[N][20],bz[N],e[N];  
    struct node{  
        int x,y;  
    };  
    node a[N*2],b[N];  
    bool cnt(node x,node y){return (x.x<y.x)||((x.x==y.x)&&(x.y<y.y));}  
    void dg(int x,int fa)  
    {  
        fo(i,b[x].x,b[x].y) if(a[i].y!=fa) f[a[i].y][0]=x,dg(a[i].y,x);  
        dfn[x]=++tot;e[tot]=x;  
    }  
    void up(int x)  
    {  
        if(x<=1) return;  
        if(d[x]<d[x/2]) swap(d[x],d[x/2]),up(x/2);else return;  
    }  
    void down(int x)  
    {  
        int y=x*2;if(d[x*2]>d[x*2+1]&&y<tot) y++;  
        if(y>tot) return;  
        if(d[x]>d[y]) swap(d[x],d[y]),down(y);else return;  
    }  
    int fd(int x)  
    {  
        int ans=0;  
        for(int i=16;i>=0;i--) if(bz[f[x][i]]) x=f[x][i],ans+=1<<i;  
        printf("%d\n",ans);return x;  
    }  
    int main()  
    {  
        int ac;scanf("%d%d",&n,&ac);  
        fo(i,1,n-1) scanf("%d%d",&a[i].x,&a[i].y),a[i+n-1].x=a[i].y,a[i+n-1].y=a[i].x;  
        sort(a+1,a+n+n-1,cnt);fo(i,1,n*2-1) if(a[i].x!=a[i-1].x) b[a[i-1].x].y=i-1,b[a[i].x].x=i;  
        dg(1,0);tot=0;fo(i,1,n) d[++tot]=dfn[i],up(tot);  
        fo(j,1,16)  
            fo(i,1,n) f[i][j]=f[f[i][j-1]][j-1];  
        for(;ac;ac--)  
        {  
            int jy,x;scanf("%d%d",&jy,&x);  
            if(jy==1)  
            {  
                for(;x>1;x--) bz[e[d[1]]]=1,swap(d[tot--],d[1]),down(1);  
                printf("%d\n",e[d[1]]);bz[e[d[1]]]=1,swap(d[tot--],d[1]),down(1);  
            }  
            else  
            {  
                int k=fd(x);d[++tot]=dfn[k];bz[k]=0;up(tot);  
            }  
        }  
    }  



發佈了56 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章