Morass

kth

Mar 10th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15. typedef vector<ii> vii;
  16. #define IN(n) int n;scanf("%d",&n);
  17. #define FOR(i, m, n) for (int i(m); i < n; i++)
  18. #define REP(i, n) FOR(i, 0, n)
  19. #define F(n) REP(i, n)
  20. #define FF(n) REP(j, n)
  21. #define FT(m, n) FOR(k, m, n)
  22. #define aa first
  23. #define bb second
  24. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  25. #define LS 18
  26. #define MX (1<<LS)
  27. vi g[MX];
  28. int D[MX],P[MX][LS+1],N,E[MX],r;
  29. void vnd(int u,int p,int d){
  30.     P[u][0]=p,D[u]=d++;
  31.     for(int i:g[u])if(i!=p)vnd(i,u,d);
  32. }
  33. void st(int r=1){
  34.     vnd(r,r,0);
  35.     F(LS)FF(MX-5)if(E[j+1])P[j+1][i+1]=P[P[j+1][i]][i];
  36. }
  37. int kth(int u,int K){
  38.     int I(0);
  39.     while(K){
  40.         if(K&1)u=P[u][I];
  41.         K>>=1,++I;
  42.     }
  43.     return u;
  44. }
  45. void tDB(int u,int p,int k){
  46.     F(k)putchar(32);
  47.     printf("%d [%d][%d]: S{",u,E[u],D[u]);
  48.     for(auto h:g[u])if(h!=p)printf("%d,",h);
  49.     printf("}: ");
  50.     int I(1);
  51.     F(LS)printf("(%d:%d) ",I,P[u][i]),I<<=1;
  52.     putchar(10);
  53.     for(auto h:g[u])if(h!=p)tDB(h,u,k+2);
  54. }
  55. int main(void){
  56.     int a,b,q;
  57.     IN(tt)F(tt){
  58. //        DEB
  59.         scanf("%d",&N);
  60.         F(N){
  61.             scanf("%d%d",&a,&b);
  62.             if(!b)r=a;
  63.             else g[a].PB(b),g[b].PB(a);
  64.             E[b]=E[a]=1;
  65.         }
  66.         st(r);
  67.         IN(Q)F(Q){
  68.             scanf("%d",&q);
  69.             if(q==2){
  70.                 //2 X K ... K-tý rodič X? - pokud X neexistuje nebo nema dost
  71.                 //rodicu, pak output == 0
  72.                 scanf("%d%d",&a,&b);
  73.                 if(!E[a]||D[a]<b){printf("0\n");continue;}
  74.                 printf("%d\n",kth(a,b));
  75. //                tDB(r,-1,0);
  76.             }else if(q){
  77.                 //1 X ... X je list k odstranění
  78.                 scanf("%d",&a);
  79.                 g[g[a][0]].erase(find(g[g[a][0]].begin(),g[g[a][0]].end(),a));
  80.                 E[a]=0,g[a].clear();
  81.             }else{
  82.                 //0 Y X ... X je nový list Y
  83.                 scanf("%d%d",&a,&b);
  84.                 E[b]=1,g[b].PB(a),g[a].PB(b),D[b]=1+D[a],*P[b]=a;
  85.                 F(LS)P[b][i+1]=P[P[b][i]][i];
  86.             }
  87.         }
  88.         CL(D,0),CL(P,0),CL(E,0);
  89.         for(auto&v:g)v.clear();
  90.     }
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment