Submission #1323630

#TimeUsernameProblemLanguageResultExecution timeMemory
1323630kaloyanMonkey and Apple-trees (IZhO12_apple)C++20
0 / 100
20 ms47352 KiB
#include <iostream> #include <algorithm> #include <vector> const int MAXN = 100000 + 10; const int MAXLOG = 30; const int INF = 1e9 + 10; int n, c; struct DynamicSegmentTree { struct Node { int sum; int left; int right; bool lazy; Node() { sum = 0; left = 0; right = 0; lazy = 0; } void assign(const Node &left, const Node &right) { sum = left.sum + right.sum; } }; int cnt = 1; Node tree[MAXLOG * MAXN]; void push(int node, int l, int r) { if(!tree[node].lazy) { return; } tree[node].sum = r - l + 1; if(l != r) { if(tree[node].left == 0) { tree[node].left = ++cnt; } if(tree[node].right == 0) { tree[node].left = ++cnt; } tree[tree[node].left].lazy = 1; tree[tree[node].right].lazy = 1; } tree[node].lazy = 0; } void update(int node, int l, int r, int queryL, int queryR) { push(node, l, r); if(queryL <= l && r <= queryR) { tree[node].lazy = 1; push(node, l, r); return; } int mid = l + r >> 1; if(queryL <= mid) { if(tree[node].left == 0) { tree[node].left = ++cnt; } update(tree[node].left, l, mid, queryL, queryR); } if(mid + 1 <= queryR) { if(tree[node].right == 0) { tree[node].right = ++cnt; } update(tree[node].right, mid + 1, r, queryL, queryR); } tree[node].assign(tree[tree[node].left], tree[tree[node].right]); } int query(int node, int l, int r, int queryL, int queryR) { push(node, l, r); if(node == 0 || r < queryL || queryR < l) { return 0; } if(queryL <= l && r <= queryR) { return tree[node].sum; } int res = 0; int mid = l + r >> 1; res += query(tree[node].left, l, mid, queryL, queryR); res += query(tree[node].right, mid + 1, r, queryL, queryR); return res; } void update(int l, int r) { update(1, 1, INF, l, r); } int query(int l, int r) { return query(1, 1, INF, l , r); } }; DynamicSegmentTree tree; void solve() { std::cin >> n; for(int i = 1 ; i <= n ; ++i) { int type, x, y; std::cin >> type >> x >> y; if(type == 1) { c = tree.query(x + c, y + c); std::cout << c << "\n"; } else { tree.update(x + c, y + c); } } } void fastIO() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); } int main() { fastIO(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...