Submission #339792

#TimeUsernameProblemLanguageResultExecution timeMemory
339792Vladikus004Monkey and Apple-trees (IZhO12_apple)C++14
100 / 100
522 ms207812 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define inf 2e9
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;

struct node{
    int sum, tl, tr, mod;
    node *l, *r;
    node(){
        sum = 0; tl = tr = mod = -1;
        l = r = nullptr;
    }
    node(int L, int R, int SUM){
        sum = SUM; tl = L; tr = R;
        mod = -1;
        l = r = nullptr;
    }
};

const int SZ = (int)1e9+3;
node *root = new node(0, SZ, 0);

void push(node *v){
    if (v->tl == v->tr) return;
    int tm = (v->tl + v->tr) / 2;
    if (!v->l)
        v->l = new node(v->tl, tm, 0);
    if (!v->r)
        v->r = new node(tm + 1, v->tr, 0);
    if (v->mod != -1){
        v->l->mod = v->mod;
        v->r->mod = v->mod;
        v->l->sum = (v->l->tr - v->l->tl + 1) * (v->mod);
        v->r->sum = (v->r->tr - v->r->tl + 1) * (v->mod);
        v->mod = -1;
    }
}

void up(node *v, int l, int r, int val){
    if (l > r) return;
    if (v->tl == l && v->tr == r) {
        v->sum = val * (v->tr - v->tl + 1);
        v->mod = val;
        return;
    }
    push(v);
    int tm = (v->tr + v->tl) / 2;
    up(v->l, l, min(r, tm), val);
    up(v->r, max(tm + 1, l), r, val);
    v->sum = v->l->sum + v->r->sum;
}

int get_sum(node *v, int l, int r){
    if (l > r) return 0;
    if (v->tl == l && v->tr == r) return v->sum;
    push(v);
    int tm = (v->tr + v->tl) / 2;
    int ans = 0;
    ans += get_sum(v->l, l, min(r, tm));
    ans += get_sum(v->r, max(l, tm + 1), r);
    return ans;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
//    freopen("input.txt", "r", stdin);
    int m;
    cin >> m;
    int c = 0;
    while (m--){
        int tp,l,r;
        cin >> tp >> l >> r;
        if (tp == 1){
            cout << (c = get_sum(root, l + c, r + c))    << "\n";
//            up(root, l + c, r + c, 0);
        }else{
            up(root, l + c, r + c, 1);
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...