제출 #1255238

#제출 시각아이디문제언어결과실행 시간메모리
1255238MisterReaper원숭이와 사과 나무 (IZhO12_apple)C++20
0 / 100
137 ms52504 KiB
// File F.cpp created on 08.08.2025 at 20:15:00
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

int Q;
constexpr int N = int(1E9);
constexpr int max_Q = int(1E5) + 5;
constexpr int LOG = 33;

struct node {
    int sum = 0, lc = -1, rc = -1;
    bool lz = false;
    node() {}
} tree[max_Q * LOG];

int node_alloc = 0;
int new_node() {
    return node_alloc++;
}

#define def int mid = (l + r) >> 1;
void push(int v, int l, int r) {
    def;
    if (tree[v].lc == -1) {
        tree[v].lc = new_node();
        tree[v].rc = new_node();
    }
    if (tree[v].lz) {
        tree[tree[v].lc].lz = true;
        tree[tree[v].lc].sum = mid - l + 1;
        tree[tree[v].rc].lz = true;
        tree[tree[v].rc].sum = r - mid;
        tree[v].lz = false;
    }
}

void modify(int v, int l, int r, int ql, int qr) {
    if (ql == l && r == qr) {
        tree[v].lz = true;
        tree[v].sum = r - l + 1;
        return;
    }
    push(v, l, r);
    def;
    if (qr <= mid) {
        modify(tree[v].lc, l, mid, ql, qr);
    } else if (mid + 1 <= ql) {
        modify(tree[v].rc, mid + 1, r, ql, qr);
    } else {
        modify(tree[v].lc, l, mid, ql, mid);
        modify(tree[v].rc, mid + 1, r, mid + 1, qr);
    }
    tree[v].sum = tree[tree[v].lc].sum + tree[tree[v].rc].sum;
}

int get(int v, int l, int r, int ql, int qr) {
    if (ql == l && r == qr) {
        return tree[v].sum;
    }
    push(v, l, r);
    def;
    if (qr <= mid) {
        return get(tree[v].lc, l, mid, ql, qr);
    } else if (mid + 1 <= ql) {
        return get(tree[v].rc, mid + 1, r, ql, qr);
    } else {
        return get(tree[v].lc, l, mid, ql, mid)
             + get(tree[v].rc, mid + 1, r, mid + 1, qr);
    }
}

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

    std::cin >> Q;

    int root = new_node();

    int C = 0;
    while (Q--) {
        int TP, X, Y;
        std::cin >> TP >> X >> Y;
        X += C;
        Y += C;
        if (TP == 1) {
            int ans = get(root, 1, N, X, Y);
            std::cout << ans << '\n';
            C = ans;
        } else {
            modify(root, 1, N, X, Y);
        }
    }

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