Advertisement
mohammedehab2002

Untitled

Nov 17th, 2020
963
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. int p[100005],ch[2][100005];
  2. bool flip[100005];
  3. int sz[100005];
  4. void push(int node)
  5. {
  6.     if (flip[node])
  7.     {
  8.         flip[node]=0;
  9.         swap(ch[0][node],ch[1][node]);
  10.         if (ch[0][node])
  11.         flip[ch[0][node]]^=1;
  12.         if (ch[1][node])
  13.         flip[ch[1][node]]^=1;
  14.     }
  15. }
  16. void recalc(int node)
  17. {
  18.     push(ch[0][node]);
  19.     push(ch[1][node]);
  20.     sz[node]=1+sz[ch[0][node]]+sz[ch[1][node]];
  21. }
  22. int side(int node)
  23. {
  24.     if (!p[node])
  25.     return -2;
  26.     if (ch[0][p[node]]==node)
  27.     return 0;
  28.     if (ch[1][p[node]]==node)
  29.     return 1;
  30.     return -1;
  31. }
  32. void attach(int par,int node,int s)
  33. {
  34.     if (node)
  35.     p[node]=par;
  36.     if (s>=0)
  37.     ch[s][par]=node;
  38. }
  39. void rotate(int node)
  40. {
  41.     int s=side(node),par=p[node];
  42.     attach(p[par],node,side(par));
  43.     attach(par,ch[!s][node],s);
  44.     attach(node,par,!s);
  45.     recalc(par);
  46.     recalc(node);
  47. }
  48. void splay(int node)
  49. {
  50.     while (side(node)>=0 && side(p[node])>=0)
  51.     {
  52.         push(p[p[node]]);
  53.         push(p[node]);
  54.         push(node);
  55.         rotate((side(node)==side(p[node]))? p[node]:node);
  56.         rotate(node);
  57.     }
  58.     if (side(node)>=0)
  59.     {
  60.         push(p[node]);
  61.         push(node);
  62.         rotate(node);
  63.     }
  64.     push(node);
  65. }
  66. void access(int node)
  67. {
  68.     int o=node,cur=0;
  69.     while (node)
  70.     {
  71.         splay(node);
  72.         ch[1][node]=cur;
  73.         recalc(node);
  74.         cur=node;
  75.         node=p[node];
  76.     }
  77.     splay(o);
  78. }
  79. void reroot(int node)
  80. {
  81.     access(node);
  82.     flip[node]^=1;
  83.     access(node);
  84. }
  85. int dep(int node)
  86. {
  87.     access(node);
  88.     return sz[ch[0][node]];
  89. }
  90. int find(int node)
  91. {
  92.     access(node);
  93.     while (ch[0][node])
  94.     {
  95.         node=ch[0][node];
  96.         push(node);
  97.     }
  98.     access(node);
  99.     return node;
  100. }
  101. void link(int x,int y)
  102. {
  103.     reroot(x);
  104.     access(y);
  105.     attach(x,y,0);
  106.     recalc(x);
  107. }
  108. void cut(int x,int y)
  109. {
  110.     reroot(x);
  111.     access(y);
  112.     p[ch[0][y]]=0;
  113.     ch[0][y]=0;
  114.     recalc(y);
  115. }
  116. int parent(int node)
  117. {
  118.     access(node);
  119.     node=ch[0][node];
  120.     push(node);
  121.     while (ch[1][node])
  122.     {
  123.         node=ch[1][node];
  124.         push(node);
  125.     }
  126.     access(node);
  127.     return node;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement