Submission #1175573

#TimeUsernameProblemLanguageResultExecution timeMemory
1175573matus192Monkey and Apple-trees (IZhO12_apple)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> oset;

#define REP(i, a, b) for (ll i = (a); i < (b); i++)
#define FOR(i, x) for (auto &i : x)
#define ff first
#define ss second
#define pb push_back
#define all(x) x.begin(), x.end()
#define IMAX INT_MAX
#define IMIN INT_MIN
#define LMAX LONG_LONG_MAX
#define LMIN LONG_LONG_MIN
#define MOD 1000000007
#define SIR 1000000009

struct Node {
    int sz, val, l, r;
    bool cele;
    Node *lson, *rson;
    Node(int vl, int vr) {
        l = vl;
        r = vr;
        sz = r - l;
        lson = NULL;
        rson = NULL;
        val = 0;
        cele = false;
    }

    void remove() {
        if (sz == 1 || !cele) return;
        if (!lson) lson = new Node(l, (l + r) / 2);
        if (!rson) rson = new Node((l + r) / 2, r);
        lson->cele = true;
        rson->cele = true;
        lson->val = lson->sz;
        rson->val = rson->sz;
    }

    int sum(int vl, int vr) {
        if (vr <= l || vl >= r) return 0;
        if (vl <= l && vr >= r) return val;
        remove();
        int lans = lson->sum(vl, vr);
        int rans = rson->sum(vl, vr);
        return lans + rans;
    }

    void prepni(int vl, int vr) {
        if (vr <= l || vl >= r) return;
        if (vl <= l && vr >= r) {
            cele = true;
            val = sz;
            return;
        }
        remove();
        lson->prepni(vl, vr);
        rson->prepni(vl, vr);
        val = lson->val + rson->val;
    }
};

int main() {
    int m;
    cin >> m;
    Node R = Node(0, 1e9+1);
    int C = 0;
    REP(i, 0, m) {
        int t, x, y;
        cin >> t >> x >> y;
        if (t == 1) {
            C = R.sum(x + C, y + C + 1);
            cout << C << '\n';
        } else {
            R.prepni(x + C, y + C + 1);
        }
    }

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