想到其實只要收尾搞一搞其實就很水了。
#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);
}
}
}
樹上亂搞
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.