Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2014
2,386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. class cart_tree {
  2.   typedef struct _Node {
  3.     int x, y, cnt;
  4.     _Node *l, *r;
  5.  
  6.     _Node(int _x) : x(_x), y((rand() << 16) ^ rand()), cnt(1), l(NULL), r(NULL) {}
  7.     ~_Node() { delete l; delete r; }
  8.     void recalc() {
  9.       cnt = 1;
  10.       if (l) cnt += l->cnt;
  11.       if (r) cnt += r->cnt;
  12.     }
  13.   } *Node;
  14.  
  15.   Node merge(Node l, Node r) {
  16.     if (!l || !r) return l ? l : r;
  17.     if (l->y < r->y) {
  18.       l->r = merge(l->r, r);
  19.       l->recalc();
  20.       return l;
  21.     } else {
  22.       r->l = merge(l, r->l);
  23.       r->recalc();
  24.       return r;
  25.     }
  26.   }
  27.  
  28.   void split(Node v, int x, Node &l, Node &r) {
  29.     l = r = NULL;
  30.     if (!v) return;
  31.     if (v->x < x) {
  32.       split(v->r, x, v->r, r);
  33.       l = v;
  34.     } else {
  35.       split(v->l, x, l, v->l);
  36.       r = v;
  37.     }
  38.     v->recalc();
  39.   }
  40.  
  41.   Node root;
  42.   public:
  43.   cart_tree() : root(NULL) {}
  44.   ~cart_tree() { delete root; }
  45.   void insert(int x) {
  46.     Node l, r;
  47.     split(root, x, l, r);
  48.     root = merge(merge(l, new _Node(x)), r);
  49.   }
  50.   void erase(int x) {
  51.     Node l, m, r;
  52.     split(root, x, l, m);
  53.     split(m, x + 1, m, r);
  54.     assert(m && m->cnt == 1 && m->x == x);
  55.     delete m;
  56.     root = merge(l, r);
  57.   }
  58.   int size() const { return root ? root->cnt : 0; }
  59. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement