Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize ("unroll-loops")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include <bits/stdc++.h>
- using namespace std;
- struct node{
- int L,R;
- int x = 1;
- bool all = true;
- node* l = nullptr;
- node* r = nullptr;
- node(int lr, int rr){
- L = lr;
- R = rr;
- }
- };
- inline void push_any(node* &v){
- v->all = false;
- if(v->l != nullptr) v->l->all = true;
- if(v->r != nullptr) v->r->all = true;
- if(v->x == 0){
- if(v->l != nullptr) v->l->x = 0;
- if(v->r != nullptr) v->r->x = 0;
- }else{
- if(v->l != nullptr) v->l->x = v->l->R - v->l->L;
- if(v->r != nullptr) v->r->x = v->r->R - v->r->L;
- }
- }
- inline void need_and_push(node* &v, bool a, bool b){
- if(v->l != nullptr && v->r != nullptr){
- if(v->all)
- push_any(v);
- return;
- }
- if(v->all){
- if(v->l == nullptr && a) v->l = new node(v->L, (v->L + v->R)/2);
- if(v->r == nullptr && b) v->r = new node((v->L + v->R)/2, v->R);
- push_any(v);
- return;
- }
- if(v->l == nullptr && a){
- v->l = new node(v->L, (v->L + v->R)/2);
- v->l->x = v->x - v->r->x;
- return;
- }
- if(v->r == nullptr && b){
- v->r = new node((v->L + v->R)/2, v->R);
- v->r->x = v->x - v->l->x;
- }
- }
- inline void setx(node*& v, int lr, int rr, int y){
- if(v == nullptr)
- return;
- if(v->R <= lr || rr <= v->L || ((y == 1 && v->x == v->R - v->L) || (y == 0 && v->x == 0)))
- return;
- if(lr <= v->L && v->R <= rr){
- v->all = true;
- v->x = y*(v->R - v->L);
- return;
- }
- int m = (v->L + v->R)/2;
- if(m <= lr)
- need_and_push(v, false, true);
- else if(rr <= m)
- need_and_push(v, true, false);
- else
- need_and_push(v, true, true);
- if(v->l != nullptr) v->x -= v->l->x;
- setx(v->l, lr, rr, y);
- if(v->l != nullptr) v->x += v->l->x;
- if(v->r != nullptr) v->x -= v->r->x;
- setx(v->r, lr, rr, y);
- if(v->r != nullptr) v->x += v->r->x;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- int n, q, l, r, k;
- cin >> n >> q;
- node* root = new node(0,n);
- root->x = n;
- while(q--){
- cin >> l >> r >> k;
- setx(root, l-1, r, k-1);
- cout << root->x << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement