Submission #1252363

#TimeUsernameProblemLanguageResultExecution timeMemory
1252363hossainrasel1042원숭이와 사과 나무 (IZhO12_apple)C++17
0 / 100
390 ms290492 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int L = 1;
const int R = 1e9;

struct Node {
    Node *l, *r;
    int val, lazy;
    Node() : l(nullptr), r(nullptr), val(0), lazy(0) {}
};

void push(Node*& root, int l, int r) {
    if (!root || root->lazy == 0) return;
    root->val = (r - l + 1);
    if (l != r) {
        int mid = (l + r) >> 1;
        if (!root->l) root->l = new Node();
        if (!root->r) root->r = new Node();
        root->l->val = mid - l + 1;
        root->r->val = r - mid;
        root->l->lazy = 1;
        root->r->lazy = 1;
    }
    root->lazy = 0;
}

void update(Node*& root, int l, int r, int ql, int qr) {
    if (r < ql || l > qr) return;
    if (!root) root = new Node();
    push(root, l, r);
    if (l >= ql && r <= qr) {
        root->lazy = 1;
        push(root, l, r);
        return;
    }
    int mid = (l + r) >> 1;
    update(root->l, l, mid, ql, qr);
    update(root->r, mid + 1, r, ql, qr);
    root->val = (root->l ? root->l->val : 0) + (root->r ? root->r->val : 0);
}

int query(Node*& root, int l, int r, int ql, int qr) {
    if (!root || r < ql || l > qr) return 0;
    push(root, l, r);
    if (l >= ql && r <= qr) return root->val;
    int mid = (l + r) >> 1;
    return query(root->l, l, mid, ql, qr) + query(root->r, mid + 1, r, ql, qr);
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int M;
    cin >> M;

    int C = 0;
    Node* root = nullptr;

    while (M--) {
        int D, X, Y;
        cin >> D >> X >> Y;
        int ql = X + C;
        int qr = Y + C;

        if (D == 1) {
            C = query(root, L, R, ql, qr);
            cout << C << '\n';
        } else {
            update(root, L, R, ql, qr);
        }
    }

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