Advertisement
Guest User

Block Tree

a guest
Feb 19th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 10007
  3.  
  4. using namespace std;
  5. typedef pair<int, int> pii;
  6.  
  7. struct node{
  8.     int val, lazy;
  9.     node *p,  *s, *t, *q;
  10.  
  11.     node(){}
  12.     node(int _val, int _lazy){
  13.         val = _val;
  14.         lazy = _lazy;
  15.         p = NULL;
  16.         s = NULL;
  17.         t = NULL;
  18.         q = NULL;
  19.     }
  20. };
  21.  
  22. node *bt;
  23.  
  24. bool check(pii x, pii y, pii w) {
  25.     if (w.first > x.first && w.first < x.second
  26.     && w.second > x.second && w.second < y.second) return true;
  27.     return false;
  28. }
  29.  
  30. void add(node * no, pii l, pii r, int val){
  31.     no->lazy += val;
  32.     no->val += val*(r.second-r.first)*(l.second-l.first);
  33. }
  34.  
  35. void dolazy(node *no, pii l, pii r){
  36.     int mid1 = (l.first + r.first)/2;
  37.     int mid2 = (l.second + r.second)/2;
  38.  
  39.     if(no->t == NULL) no->t = new node(0, 0);
  40.     add(no->t, l, make_pair(mid1, mid2), no->lazy);
  41.     if(no->p == NULL) no->p = new node(0, 0);
  42.     add(no->p, make_pair(mid1+1, mid2+1), r, no->lazy);
  43.     if(no->q == NULL) no->q = new node(0, 0);
  44.     add(no->q, make_pair(mid1+1, l.second), make_pair(r.first, mid2), no->lazy);
  45.     if(no->s == NULL) no->s = new node(0, 0);
  46.     add(no->s, make_pair(l.first, mid2+1), make_pair(mid1, r.second), no->lazy);
  47.     no->lazy = 0;
  48. }
  49.  
  50. void update(node * no, pii l, pii r, pii x, pii y, int val){
  51.     if(!check(x, y, l) && !check(x, y, r)) return;
  52.     else if(check(x, y, l) && check(x, y, r)){
  53.         no->lazy = val;
  54.         no->val = val*(r.second-r.first)*(l.second-l.first);
  55.     }else{
  56.         int mid1 = (l.first + r.first)/2;
  57.         int mid2 = (l.second + r.second)/2;
  58.         dolazy(no, x, y);
  59.  
  60.         update(no->t, l, make_pair(mid1, mid2), x, y, val);
  61.         update(no->p, make_pair(mid1+1, mid2+1), r, x, y, val);
  62.         update(no->q, make_pair(mid1+1, l.second), make_pair(r.first, mid2), x, y, val);
  63.         update(no->s, make_pair(l.first, mid2+1), make_pair(mid1, r.second), x, y, val);
  64.  
  65.         no->val = no->p->val + no->s->val + no->t->val + no->q->val;
  66.     }
  67. }
  68.  
  69. int query(node * no, pii l, pii r, pii x, pii y){
  70.     if(!check(x, y, l) && !check(x, y, r)) return 0;
  71.     else if(check(x, y, l) && check(x, y, r)) return no->val;
  72.     else{
  73.         int mid1 = (l.first + r.first)/2;
  74.         int mid2 = (l.second + r.second)/2;
  75.         dolazy(no, x, y);
  76.  
  77.         return query(no->t, l, make_pair(mid1, mid2), x, y) +
  78.                query(no->p, make_pair(mid1+1, mid2+1), r, x, y) +
  79.                query(no->q, make_pair(mid1+1, l.second), make_pair(r.first, mid2), x, y) +
  80.                query(no->s, make_pair(l.first, mid2+1), make_pair(mid1, r.second), x, y);
  81.     }
  82. }
  83. int main(){
  84.     bt = new node(0,0);
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement