Submission #1181574

#TimeUsernameProblemLanguageResultExecution timeMemory
1181574vincentbucourt1Monkey and Apple-trees (IZhO12_apple)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
void fastIO(){ios_base::sync_with_stdio(false),cin.tie(0);}
#define int long long

int N;

struct Node {
    int val, nL, nR, idx, iChildL, iChildR;
};
struct Segtree {
    vector<Node> tree;
    Segtree () {
        tree.push_back(Node{0, 0, (1ll << 30)-1, 0, -1, -1});
    }
    void makeChild (int iNode) {
        if (tree[iNode].iChildL == -1 || tree[iNode].iChildR == -1) {
            int nMid = (tree[iNode].nL + tree[iNode].nR) / 2;
            tree.push_back(Node{(tree[iNode].val > 0 ? tree[iNode].val/2 : 0), tree[iNode].nL, nMid, (int)tree.size(), -1, -1});
            tree[iNode].iChildL = (int)tree.size()-1;
            tree.push_back(Node{(tree[iNode].val > 0 ? tree[iNode].val/2 : 0), nMid+1, tree[iNode].nR, (int)tree.size(), -1, -1});
            tree[iNode].iChildR = (int)tree.size()-1;
        }
    }
    int query (int iNode, int qL, int qR) {
        if (qL <= tree[iNode].nL && tree[iNode].nR <= qR) {
            return tree[iNode].val;
        }
        else if (tree[iNode].nR < qL || qR < tree[iNode].nL) {
            return 0;
        }
        makeChild(iNode);
        return query(tree[iNode].iChildL, qL, qR) + query(tree[iNode].iChildR, qL, qR);
    }
    int query (int l, int r) {
        return query(0, l, r);
    }
    void update (int iNode, int qL, int qR) {
        if (qL <= tree[iNode].nL && tree[iNode].nR <= qR) {
            tree[iNode].val = (tree[iNode].nR - tree[iNode].nL + 1);
            return;
        }
        else if (tree[iNode].nR < qL || qR < tree[iNode].nL) {
            return;
        }
        makeChild(iNode);
        update(tree[iNode].iChildL, qL, qR);
        update(tree[iNode].iChildR, qL, qR);
        tree[iNode].val = tree[tree[iNode].iChildL].val + tree[tree[iNode].iChildR].val;
    }
    void update (int l, int r) {
        return update(0, l, r);
    }
};

signed main() {
    fastIO();
    cin >> N;
    Segtree interQ;
    int offset = 0;
    for (int i = 0; i < N; i++) {
        int type, l, r;
        cin >> type >> l >> r;
        if (type == 1) {
            int res = interQ.query(l+offset, r+offset);
            offset = res;
            cout << res << "\n";
        }
        else {
            assert(type == 2);
            interQ.update(l+offset, r+offset);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...