Advertisement
Manioc

Block Tree

Feb 19th, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 100007
  3. #define INF 1e9 + 7
  4.  
  5. using namespace std;
  6. typedef pair<int, int> pii;
  7.  
  8. struct node{
  9.     int val, lazy;
  10.     node *p,  *s, *t, *q;
  11.  
  12.     node(){}
  13.     node(int _val, int _lazy){
  14.         val = _val;
  15.         lazy = _lazy;
  16.         p = NULL;
  17.         s = NULL;
  18.         t = NULL;
  19.         q = NULL;
  20.     }
  21. };
  22.  
  23. node *bt;
  24.  
  25. bool check(pii x, pii y, pii w) {
  26.     if (w.first >= x.first && w.first <= y.first
  27.     && w.second >= x.second && w.second <= y.second) return true;
  28.     return false;
  29. }
  30.  
  31. void add(node *no, pii l, pii r, int val){
  32.     no->lazy += val;
  33.     no->val += val;
  34.     //cout << "Update " << l.first << " " << l.second << " - " << r.first << " " << r.second << " with " << val*abs(r.second-r.first+1)*abs(l.second-l.first+1) << endl;
  35. }
  36.  
  37. void dolazy(node *no, pii l, pii r){
  38.     //cout << "do lazy\n";
  39.     int mid1 = (l.first + r.first)/2;
  40.     int mid2 = (l.second + r.second)/2;
  41.  
  42.     if(no->t == NULL) no->t = new node(0, 0);
  43.     add(no->t, l, make_pair(mid1, mid2), no->lazy);
  44.     if(no->p == NULL) no->p = new node(0, 0);
  45.     add(no->p, make_pair(mid1+1, mid2+1), r, no->lazy);
  46.     if(no->q == NULL) no->q = new node(0, 0);
  47.     add(no->q, make_pair(mid1+1, l.second), make_pair(r.first, mid2), no->lazy);
  48.     if(no->s == NULL) no->s = new node(0, 0);
  49.     add(no->s, make_pair(l.first, mid2+1), make_pair(mid1, r.second), no->lazy);
  50.     no->lazy = 0;
  51. }
  52.  
  53. int cnt;
  54. void update(node *no, pii l, pii r, pii x, pii y, int val){
  55.     //cnt++;
  56.     if( l.first > y.first || r.first < x.first ||
  57.         l.second > y.second || r.second < x.second) {
  58.         //cout << "First Carse\n";
  59.         return;
  60.     }else if(check(x, y, l) && check(x, y, r)){
  61.         ///cout << "Second Carse\n";
  62.         no->lazy += val;
  63.         int calc = val;
  64.         no->val += calc;
  65.         //cout << "Update " << l.first << " " << l.second << " - " << r.first << " " << r.second << " with " << calc << endl;
  66.     }else{
  67.         //cout << "Third Carse\n";
  68.         int mid1 = (l.first + r.first)/2;
  69.         int mid2 = (l.second + r.second)/2;
  70.         dolazy(no, l, r);
  71.  
  72.         update(no->t, l, make_pair(mid1, mid2), x, y, val);
  73.         update(no->p, make_pair(mid1+1, mid2+1), r, x, y, val);
  74.         update(no->q, make_pair(mid1+1, l.second), make_pair(r.first, mid2), x, y, val);
  75.         update(no->s, make_pair(l.first, mid2+1), make_pair(mid1, r.second), x, y, val);
  76.  
  77.         no->val = min(no->p->val, min( no->s->val, min( no->t->val, no->q->val)));
  78.     }
  79. }
  80.  
  81. int query(node *no, pii l, pii r, pii x, pii y){
  82.     if( l.first > y.first || r.first < x.first ||
  83.         l.second > y.second || r.second < x.second) {
  84.         //cout << "First Case\n";
  85.         return INF;
  86.     }else if(check(x, y, l) && check(x, y, r)) {
  87.         //cout << "Second Case\n";
  88.         return no->val;
  89.     }else{
  90.         //cout << "Third Case\n";
  91.         int mid1 = (l.first + r.first)/2;
  92.         int mid2 = (l.second + r.second)/2;
  93.         dolazy(no, l, r);
  94.  
  95.         return min( min( min( query(no->t, l, make_pair(mid1, mid2), x, y) ,
  96.                query(no->p, make_pair(mid1+1, mid2+1), r, x, y)),
  97.                query(no->q, make_pair(mid1+1, l.second), make_pair(r.first, mid2), x, y)),
  98.                query(no->s, make_pair(l.first, mid2+1), make_pair(mid1, r.second), x, y));
  99.     }
  100. }
  101.  
  102. pair<pii, pii> sq[MAX];
  103. int main(){
  104.     bt = new node(0,0);
  105.     int q; scanf("%d", &q);
  106.     int id = 1;
  107.     while(q--){
  108.         int tipo; scanf("%d", &tipo);
  109.         if(tipo == 1){
  110.             pii x, y; scanf("%d %d %d %d", &x.first, &x.second, &y.first, &y.second);
  111.             sq[id++] = make_pair(x, y);
  112.             //cnt = 0;
  113.             update(bt, make_pair(0,0), make_pair(1000000007, 1000000007), x, y, 1);
  114.             //cout << cnt << endl;
  115.         }else if(tipo == 2){
  116.             int i; scanf("%d", &i);
  117.             id++;
  118.             update(bt, make_pair(0,0), make_pair(50007, 50007), sq[i].first, sq[i].second, -1);
  119.         }else{
  120.             pii x, y; scanf("%d %d %d %d", &x.first, &x.second, &y.first, &y.second);
  121.             int onlyx = query(bt, make_pair(0,0), make_pair(10007, 50007), x, x);
  122.             int onlyy = query(bt, make_pair(0,0), make_pair(50007, 50007), y, y);
  123.             int bigd  = query(bt, make_pair(0,0), make_pair(50007, 50007), x, y);
  124.             //cout << onlyx << " " << onlyy << " " << bigd << endl;
  125.             printf("%c", (onlyy == onlyx && onlyx == bigd)? 'Y':'N');
  126.             id++;
  127.         }
  128.     }
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement