Submission #1243337

#TimeUsernameProblemLanguageResultExecution timeMemory
1243337lorebas12Monkey and Apple-trees (IZhO12_apple)C++20
0 / 100
425 ms263448 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAX_RANGE = 1e9; struct Node { int sum = 0, lazy = 0; int left = -1, right = -1; }; vector<Node> seg(1); // nó 0 é a raiz int C = 0; // valor acumulado da query anterior int create_node() { seg.push_back(Node()); return seg.size() - 1; } void push(int u, int l, int r) { if (seg[u].lazy == 0) return; // Aplica o lazy no nó atual seg[u].sum = (r - l + 1); // marcar tudo como maduro if (l != r) { if (seg[u].left == -1) seg[u].left = create_node(); if (seg[u].right == -1) seg[u].right = create_node(); seg[seg[u].left].lazy = 1; seg[seg[u].right].lazy = 1; } seg[u].lazy = 0; } void update(int u, int l, int r, int ql, int qr) { push(u, l, r); if (qr < l || r < ql) return; if (ql <= l && r <= qr) { seg[u].lazy = 1; push(u, l, r); return; } int m = (l + r) / 2; if (seg[u].left == -1) seg[u].left = create_node(); if (seg[u].right == -1) seg[u].right = create_node(); update(seg[u].left, l, m, ql, qr); update(seg[u].right, m + 1, r, ql, qr); seg[u].sum = seg[seg[u].left].sum + seg[seg[u].right].sum; } int query(int u, int l, int r, int ql, int qr) { if (u == -1 || qr < l || r < ql) return 0; push(u, l, r); if (ql <= l && r <= qr) return seg[u].sum; int m = (l + r) / 2; int sl = query(seg[u].left, l, m, ql, qr); int sr = query(seg[u].right, m + 1, r, ql, qr); return sl + sr; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int M; cin >> M; while (M--) { int D, X, Y; cin >> D >> X >> Y; X += C; Y += C; if (D == 1) { int ans = query(0, 1, MAX_RANGE, X, Y); cout << ans << '\n'; C = ans; } else { update(0, 1, MAX_RANGE, X, Y); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...