Submission #888539

#TimeUsernameProblemLanguageResultExecution timeMemory
888539dwuyMonkey and Apple-trees (IZhO12_apple)C++14
100 / 100
343 ms139700 KiB
#include <bits/stdc++.h>
using namespace std;

struct Node{
    bool lz;
    int sum;
    Node *l, *r;

    Node(){
        this->lz = 0;
        this->sum = 0;
        this->l = this->r = NULL;
    }
};

struct SMT{
    int n;
    Node *root;

    SMT(int n=0){
        this->n = n;
        this->root = new Node();
    }

    void down(Node *cur, int l, int r){
        if(cur->lz == 0) return;
        int mid = (l+r)>>1;
        cur->l->lz = cur->r->lz = 1;
        cur->l->sum = mid-l+1;
        cur->r->sum = r-mid;
        cur->lz = 0;
    }

    void update(Node *cur, int l, int r, const int &u, const int &v){
        if(l>v || r<u) return;
        if(l>=u && r<=v){
            cur->lz = 1;
            cur->sum = (r-l+1);
            return;
        }
        if(!cur->l) cur->l = new Node();
        if(!cur->r) cur->r = new Node();
        down(cur, l, r);
        int mid = (l+r)>>1;
        update(cur->l, l, mid, u, v);
        update(cur->r, mid+1, r, u, v);
        cur->sum = cur->l->sum + cur->r->sum;
    }

    void update(int l, int r){
        update(root, 1, n, l, r);
    }

    int get(Node *cur, int l, int r, const int &u, const int &v){
        if(l>v || r<u) return 0;
        if(l>=u && r<=v) return cur->sum;
        if(!cur->l) cur->l = new Node();
        if(!cur->r) cur->r = new Node();
        down(cur, l, r);
        int mid = (l+r)>>1;
        return get(cur->l, l, mid, u, v) + get(cur->r, mid+1, r, u, v);
    }

    int get(int l, int r){
        return get(root, 1, n, l, r);
    }
};

void solve(){
    int q;
    cin >> q;
    SMT smt(1000000000);
    int C = 0;
    while(q--){
        int oper, l, r;
        cin >> oper >> l >> r;
        l += C; r += C;
        if(oper == 2) smt.update(l, r);
        else{
            C = smt.get(l, r);
            cout << C << endl;
        }
    }
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...