EntropyIncreaser

MinDeltaTree

Mar 4th, 2018
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. struct Data {
  8.     int v, id;
  9.    
  10.     bool operator<(const Data& x) const {
  11.         return v < x.v;
  12.     }
  13. };
  14.  
  15. const int N = 250010;
  16.  
  17. struct LinkCutTree {
  18.     struct Node {
  19.         bool rev;
  20.         Data v, myn;
  21.         union {
  22.             struct {
  23.                 Node *ls, *rs;
  24.             };
  25.             Node* ch[2];
  26.         };
  27.         Node *prt, *path;
  28.        
  29.         bool relation() const {
  30.             return this == prt->rs;
  31.         }
  32.        
  33.         void pushDown() {
  34.             if (rev) {
  35.                 rev = false;
  36.                 swap(ls, rs);
  37.                 if (ls)
  38.                     ls->rev = !ls->rev;
  39.                 if (rs)
  40.                     rs->rev = !rs->rev;
  41.             }
  42.         }
  43.        
  44.         void update() {
  45.             myn = v;
  46.             if (ls)
  47.                 myn = min(myn, ls->myn);
  48.             if (rs)
  49.                 myn = min(myn, rs->myn);
  50.         }
  51.        
  52.         void rotate() {
  53.             if (prt->prt)
  54.                 prt->prt->pushDown();
  55.             prt->pushDown();
  56.             pushDown();
  57.             path = prt->path;
  58.             prt->path = NULL;
  59.             Node* p = prt;
  60.             bool f = relation();
  61.             if (p->prt)
  62.                 p->prt->ch[p->relation()] = this;
  63.             prt = p->prt;
  64.             p->ch[f] = ch[!f];
  65.             if (ch[!f])
  66.                 ch[!f]->prt = p;
  67.             ch[!f] = p;
  68.             p->prt = this;
  69.             p->update();
  70.             update();
  71.         }
  72.        
  73.         void splay() {
  74.             while (prt) {
  75.                 if (!prt->prt)
  76.                     return rotate();
  77.                 prt->prt->pushDown();
  78.                 prt->pushDown();
  79.                 if (relation() == prt->relation()) {
  80.                     prt->rotate();
  81.                     rotate();
  82.                 } else {
  83.                     rotate();
  84.                     rotate();
  85.                 }
  86.             }
  87.         }
  88.        
  89.         void expose() {
  90.             splay();
  91.             pushDown();
  92.             if (rs) {
  93.                 rs->path = this;
  94.                 rs->prt = NULL;
  95.                 rs = NULL;
  96.                 update();
  97.             }
  98.         }
  99.        
  100.         bool splice() {
  101.             splay();
  102.             if (!path)
  103.                 return false;
  104.             path->expose();
  105.             path->rs = this;
  106.             prt = path;
  107.             path = NULL;
  108.             prt->update();
  109.             return true;
  110.         }
  111.        
  112.         void access() {
  113.             expose();
  114.             while (splice());
  115.         }
  116.        
  117.         void evert() {
  118.             access();
  119.             splay();
  120.             rev = !rev;
  121.         }
  122.     };
  123.  
  124.     Node ver[N];
  125.    
  126.     void link(int u, int v) {
  127.         ver[u].evert();
  128.         ver[u].path = ver + v;
  129.     }
  130.    
  131.     void cut(int u, int v) {
  132.         ver[u].evert();
  133.         ver[v].access();
  134.         ver[v].splay();
  135.         ver[v].pushDown();
  136.         ver[v].ls = NULL;
  137.         ver[v].update();
  138.         ver[u].prt = NULL;
  139.     }
  140.    
  141.     Data query(int u, int v) {
  142.         ver[u].evert();
  143.         ver[v].access();
  144.         ver[v].splay();
  145.         return ver[v].myn;
  146.     }
  147. };
  148.  
  149. int main() {
  150.     return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment