Guest User

Untitled

a guest
Jan 24th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. class cart_tree {
  2.   typedef struct _Node {
  3.     int x, y;
  4.     ll sum;
  5.     int cnt;
  6.     _Node *l, *r;
  7.  
  8.     _Node(int _x) : x(_x), y(rand()), sum(_x), cnt(1), l(0), r(0) {}
  9.     ~_Node() {
  10.       if (l) delete l;
  11.       if (r) delete r;
  12.     }
  13.     void recalc() {
  14.       sum = x; cnt = 1;
  15.       if (l) sum += l->sum, cnt += l->cnt;
  16.       if (r) sum += r->sum, cnt += r->cnt;
  17.     }
  18.   } *Node;
  19.  
  20.   Node merge(Node l, Node r) {
  21.     if (!l) return r;
  22.     if (!r) return l;
  23.    
  24.     if (l->y < r->y) {
  25.       l->r = merge(l->r, r);
  26.       return l->recalc(), l;
  27.     } else {
  28.       r->l = merge(l, r->l);
  29.       return r->recalc(), r;
  30.     }
  31.   }
  32.   void split(Node v, int key, Node &l, Node &r) {
  33.     l = r = 0;
  34.     if (!v) return;
  35.    
  36.     Node tmp;
  37.     if (v->x <= key) {
  38.       split(v->r, key, tmp, r);
  39.       v->r = tmp;
  40.       l = v;
  41.     } else {
  42.       split(v->l, key, l, tmp);
  43.       v->l = tmp;
  44.       r = v;
  45.     }
  46.     v->recalc();
  47.   }
  48.  
  49.   void print(Node v) {
  50.     if (!v) { eoprintf("null\n"); return; }
  51.     eoprintf("x=%d, sum=%lld, cnt=%d\n", v->x, v->sum, v->cnt);
  52.     eoff += 2;
  53.     print(v->l);
  54.     print(v->r);
  55.     eoff -= 2;
  56.   }
  57.  
  58.   Node root;
  59.  
  60.   public:
  61.   cart_tree() : root(0){}
  62.  
  63.   void insert(int x) {
  64.     Node l, r;
  65.     split(root, x, l, r);
  66.     root = merge(merge(l, new _Node(x)), r);
  67.   }
  68.   pair<ll, int> getLeqThan(int x) {
  69.     Node l, r;
  70.     split(root, x, l, r);
  71.     pair<ll, int> res(0, 0);
  72.     if (l) res = mp(l->sum, l->cnt);
  73.     root = merge(l, r);
  74.     return res;
  75.   }
  76. };
Add Comment
Please, Sign In to add comment