Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct YNode {
- int val;
- YNode *c[2];
- YNode() {
- val = 0;
- c[0] = c[1] = NULL;
- }
- YNode* getC(int i) {
- if (!c[i]) c[i] = new YNode();
- return c[i];
- }
- void add(int y, int v, int a = 0, int b = MAX_N + 10) {
- val += v;
- if (a == b) return;
- int mid = (a + b) / 2;
- if (y <= mid) getC(0)->add(y, v, a, mid);
- else getC(1)->add(y, v, mid + 1, b);
- }
- int query(int y, int a = 0, int b = MAX_N + 10) {
- if (a >= 0 && b <= y) return val;
- if (a > y || b < 0) return 0;
- int mid = (a + b) / 2;
- return (c[0] ? c[0]->query(y, a, mid) : 0) + (c[1] ? c[1]->query(y, mid + 1, b) : 0);
- }
- };
- struct XNode {
- YNode* val;
- XNode* c[2];
- XNode() {
- val = new YNode();
- c[0] = c[1] = NULL;
- }
- XNode* getC(int i) {
- if (!c[i]) c[i] = new XNode();
- return c[i];
- }
- void add(int x, int y, int v, int a = 0, int b = MAX_N + 10) {
- val->add(y, v);
- if (a == b) return;
- int mid = (a + b) / 2;
- if (x <= mid) getC(0)->add(x, v, a, mid);
- else getC(1)->add(x, v, mid + 1, b);
- }
- int query(int x, int y, int a = 0, int b = MAX_N + 10) {
- if (a >= 0 && b <= x) return val->query(y);
- if (a > x || b < 0) return 0;
- int mid = (a + b) / 2;
- return (c[0] ? c[0]->query(x, y, a, mid) : 0) + (c[1] ? c[1]->query(x, y, mid + 1, b) : 0);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement