Advertisement
oleg_drawer

dinamic DO

Jun 3rd, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. #pragma GCC optimize ("unroll-loops")
  3. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6.  
  7. struct node{
  8.     int L,R;
  9.     int x = 1;
  10.     bool all = true;
  11.     node* l = nullptr;
  12.     node* r = nullptr;
  13.     node(int lr, int rr){
  14.         L = lr;
  15.         R = rr;
  16.     }
  17. };
  18.  
  19.  
  20. inline void push_any(node* &v){
  21.     v->all = false;
  22.     if(v->l != nullptr) v->l->all = true;
  23.     if(v->r != nullptr) v->r->all = true;
  24.     if(v->x == 0){
  25.         if(v->l != nullptr) v->l->x = 0;
  26.         if(v->r != nullptr) v->r->x = 0;
  27.     }else{
  28.         if(v->l != nullptr) v->l->x = v->l->R - v->l->L;
  29.         if(v->r != nullptr) v->r->x = v->r->R - v->r->L;
  30.     }
  31. }
  32.  
  33. inline void need_and_push(node* &v, bool a, bool b){
  34.     if(v->l != nullptr && v->r != nullptr){
  35.         if(v->all)
  36.             push_any(v);
  37.         return;
  38.     }
  39.     if(v->all){
  40.         if(v->l == nullptr && a) v->l = new node(v->L, (v->L + v->R)/2);
  41.         if(v->r == nullptr && b) v->r = new node((v->L + v->R)/2, v->R);
  42.         push_any(v);
  43.         return;
  44.     }
  45.     if(v->l == nullptr && a){
  46.         v->l = new node(v->L, (v->L + v->R)/2);
  47.         v->l->x = v->x - v->r->x;
  48.         return;
  49.     }
  50.     if(v->r == nullptr && b){
  51.         v->r = new node((v->L + v->R)/2, v->R);
  52.         v->r->x = v->x - v->l->x;
  53.     }
  54. }
  55.  
  56. inline void setx(node*& v, int lr, int rr, int y){
  57.     if(v == nullptr)
  58.         return;
  59.     if(v->R <= lr || rr <= v->L || ((y == 1 && v->x == v->R - v->L) || (y == 0 && v->x == 0)))
  60.         return;
  61.     if(lr <= v->L && v->R <= rr){
  62.         v->all = true;
  63.         v->x = y*(v->R - v->L);
  64.         return;
  65.     }
  66.     int m = (v->L + v->R)/2;
  67.     if(m <= lr)
  68.         need_and_push(v, false, true);
  69.     else if(rr <= m)
  70.         need_and_push(v, true, false);
  71.     else
  72.         need_and_push(v, true, true);
  73.  
  74.     if(v->l != nullptr) v->x -= v->l->x;
  75.     setx(v->l, lr, rr, y);
  76.     if(v->l != nullptr) v->x += v->l->x;
  77.  
  78.     if(v->r != nullptr) v->x -= v->r->x;
  79.     setx(v->r, lr, rr, y);
  80.     if(v->r != nullptr) v->x += v->r->x;
  81.  
  82. }
  83.  
  84.  
  85. int main() {
  86.     ios_base::sync_with_stdio(false);
  87.     cin.tie(nullptr);
  88.     cout.tie(nullptr);
  89.  
  90.     int n, q, l, r, k;
  91.     cin >> n >> q;
  92.     node* root = new node(0,n);
  93.     root->x = n;
  94.     while(q--){
  95.         cin >> l >> r >> k;
  96.         setx(root, l-1, r, k-1);
  97.         cout << root->x << endl;
  98.     }
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement