Advertisement
Guest User

Untitled

a guest
Nov 3rd, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. struct YNode {
  2.     int val;
  3.     YNode *c[2];
  4.     YNode() {
  5.         val = 0;
  6.         c[0] = c[1] = NULL;
  7.     }
  8.     YNode* getC(int i) {
  9.         if (!c[i]) c[i] = new YNode();
  10.         return c[i];
  11.     }
  12.     void add(int y, int v, int a = 0, int b = MAX_N + 10) {
  13.         val += v;
  14.         if (a == b) return;
  15.         int mid = (a + b) / 2;
  16.         if (y <= mid) getC(0)->add(y, v, a, mid);
  17.         else getC(1)->add(y, v, mid + 1, b);
  18.     }
  19.     int query(int y, int a = 0, int b = MAX_N + 10) {
  20.         if (a >= 0 && b <= y) return val;
  21.         if (a > y || b < 0) return 0;
  22.         int mid = (a + b) / 2;
  23.         return (c[0] ? c[0]->query(y, a, mid) : 0) + (c[1] ? c[1]->query(y, mid + 1, b) : 0);
  24.     }
  25. };
  26. struct XNode {
  27.     YNode* val;
  28.     XNode* c[2];
  29.     XNode() {
  30.         val = new YNode();
  31.         c[0] = c[1] = NULL;
  32.     }
  33.     XNode* getC(int i) {
  34.         if (!c[i]) c[i] = new XNode();
  35.         return c[i];
  36.     }
  37.     void add(int x, int y, int v, int a = 0, int b = MAX_N + 10) {
  38.         val->add(y, v);
  39.         if (a == b) return;
  40.         int mid = (a + b) / 2;
  41.         if (x <= mid) getC(0)->add(x, v, a, mid);
  42.         else getC(1)->add(x, v, mid + 1, b);
  43.     }
  44.     int query(int x, int y, int a = 0, int b = MAX_N + 10) {
  45.         if (a >= 0 && b <= x) return val->query(y);
  46.         if (a > x || b < 0) return 0;
  47.         int mid = (a + b) / 2;
  48.         return (c[0] ? c[0]->query(x, y, a, mid) : 0) + (c[1] ? c[1]->query(x, y, mid + 1, b) : 0);
  49.     }
  50. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement