Submission #337220

#TimeUsernameProblemLanguageResultExecution timeMemory
337220smaxMonkey and Apple-trees (IZhO12_apple)C++17
100 / 100
672 ms262144 KiB
#include <bits/stdc++.h>
using namespace std;

struct Node {
    int ans;
    bool lazy;
    Node *left, *right;

    Node() : ans(0), lazy(false), left(NULL), right(NULL) {}
};

void push(Node *p, int l, int r) {
    if (p && p->lazy) {
        p->ans = r - l + 1;
        p->lazy = false;
        if (l != r) {
            if (!p->left)
                p->left = new Node();
            if (!p->right)
                p->right = new Node();
            p->left->lazy = p->right->lazy = true;
        }
    }
}

int query(Node *p, int l, int r, int i, int j) {
    if (i > r || j < l || !p)
        return 0;
    if (i <= l && r <= j)
        return p->ans;
    int m = (l + r) / 2;
    push(p->left, l, m);
    push(p->right, m+1, r);
    return query(p->left, l, m, i, j) + query(p->right, m+1, r, i, j);
}

void update(Node* &p, int l, int r, int i, int j) {
    if (i > r || j < l)
        return;
    if (!p)
        p = new Node();
    if (i <= l && r <= j) {
        p->lazy = true;
        push(p, l, r);
        return;
    }
    int m = (l + r) / 2;
    push(p->left, l, m);
    push(p->right, m+1, r);
    update(p->left, l, m, i, j);
    update(p->right, m+1, r, i, j);
    p->ans = (p->left ? p->left->ans : 0) + (p->right ? p->right->ans : 0);
}

const int MAX = 1e9;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int m;
    cin >> m;
    int c = 0;
    Node *st = new Node();
    for (int i=0; i<m; i++) {
        int d, x, y;
        cin >> d >> x >> y;
        if (d == 1)
            cout << (c = query(st, 1, MAX, x + c, y + c)) << "\n";
        else
            update(st, 1, MAX, x + c, y + c);
    }

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