제출 #1290388

#제출 시각아이디문제언어결과실행 시간메모리
1290388Cyanberry원숭이와 사과 나무 (IZhO12_apple)C++20
100 / 100
30 ms2644 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int mod = 1e9 + 7;

struct Node {
    bool lset = false, rset = false, flagged = false;
    Node* left;
    Node* right;
    int lrange, rrange, val = 0;
};

void fillNodes(Node* n) {
    int l = n->lrange, r = n->rrange;
    if (r - l > 1) {
        int m = (l+r)/2;
        if (!n->lset) {
            n->left = new Node();
            n->left->lrange = l;
            n->left->rrange = m;
            n->lset = true;
        }
        if (!n->rset) {
            n->right = new Node();
            n->right->lrange = m;
            n->right->rrange = r;
            n->rset = true;
        }
    }
}

void update(Node* n, int tl, int tr) {
    int l = n->lrange, r = n->rrange;
    if (l >= tr || r <= tl) return;
    if (l >= tl && r <= tr) {
        n->flagged = true;
        n->val = r - l;
        return;
    }
    if (n->flagged) return;
    fillNodes(n);
    update(n->left, tl, tr);
    update(n->right, tl, tr);
    if (!n->flagged) {
        n->val = n->left->val + n->right->val;
    }
}

int query(Node* n, int tl, int tr) {
    int l = n->lrange, r = n->rrange;
    if (l >= tr || r <= tl) return 0;
    if (n->flagged) {
        return min(r, tr) - max(l, tl);
    }
    if (l >= tl && r <= tr) return n->val;
     fillNodes(n);
    return query(n->left, tl, tr) + query(n->right, tl, tr);
}

Node* root = new Node();

int bruh = 0;
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    root->lrange = 0;
    root->rrange = (int)1e9;
    int N, a, b, c;
    cin>>N;
    for (int i = 0; i < N; ++i) {
        cin>>a>>b>>c;
        b += bruh, c += bruh;
        if (a == 1) {
            int smh = query(root, b - 1, c);
            cout<<smh<<'\n';
            bruh = smh;
        } else if (a == 2) {
            update(root, b-1, c);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...