Advertisement
SuitNdtie

CUBE-149: Gui Pachinko

May 15th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. typedef long long int ll;
  5. using namespace std;
  6. int n;
  7.  
  8. vector<int> adj[100010];
  9.  
  10. int maxsubtree[100010];
  11. int writemax(int u){
  12.     int maxnow = u;
  13.     for(int i = 0 ; i < adj[u].size() ; i ++){
  14.         int v = adj[u][i];
  15.         maxnow = max(maxnow,writemax(v));
  16.     }
  17.     return maxsubtree[u] = maxnow;
  18. }
  19.  
  20. bool mycmp(int a,int b){
  21.     return maxsubtree[a] < maxsubtree[b];
  22. }
  23.  
  24. int order = 1;
  25. ll ordernode[100010];
  26.  
  27. void writeorder(int u){
  28.     for(int i = 0 ; i < adj[u].size() ; i ++){
  29.         int v = adj[u][i];
  30.         writeorder(v);
  31.     }
  32.     ordernode[order++] = u;
  33. }
  34.  
  35.  
  36. int main()
  37. {
  38.     int k;
  39.     scanf("%d %d",&n,&k);
  40.     for(int i = 1 ; i <= n ; i ++ ){
  41.         int p;
  42.         scanf("%d",&p);
  43.         adj[p].push_back(i);
  44.     }
  45.     writemax(0);
  46.     for(int i = 1 ; i <= n ; i ++ ){
  47.         sort(adj[i].begin(),adj[i].end(),mycmp);
  48.     }
  49. //  printf("Maxsubtree : ");for(int i = 1 ; i <= n ; i ++)printf("%d ",maxsubtree[i]);printf("\n");
  50.     writeorder(0);
  51. //  printf("Ordernode  : ");for(int i = 1 ; i <= n ; i ++)printf("%d ",ordernode[i]);printf("\n");
  52.     ll qs[n+1];qs[0] = 0;
  53.     for(int i = 1 ; i <= n ; i ++){
  54.         qs[i] = qs[i-1] + ordernode[i];
  55.     }
  56.    
  57.     int ballnow = 0;
  58.     for(int q = 0 ; q < k ; q ++){
  59.         int op;
  60.         scanf("%d",&op);
  61.         if(op == 1){
  62.             int cnt;
  63.             scanf("%d",&cnt);
  64.             ballnow += cnt;
  65.             printf("%d\n",ordernode[ballnow]);
  66.         }
  67.         else if(op == 2){
  68.             int cnt;
  69.             scanf("%d",&cnt);
  70.             ballnow -= cnt;
  71.         }
  72.         else if(op == 3){
  73.             printf("%lld\n",qs[ballnow]);
  74.         }
  75.         else{
  76.             printf("Error : %d\n",q);
  77.             return 0;
  78.         }
  79.     }
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement