Submission #522405

#TimeUsernameProblemLanguageResultExecution timeMemory
522405sinfilloMonkey and Apple-trees (IZhO12_apple)C++17
0 / 100
227 ms80884 KiB
#include <iostream> #include <iomanip> #include <vector> #include <string> #include <cassert> #include <stdio.h> #include <algorithm> #include <numeric> #include <random> #include <map> #include <set> #include <queue> #include <fstream> #include <deque> #include <unordered_map> #include <ctime> #include <optional> #include <stdexcept> #include <cstring> #include <math.h> //#pragma GCC optimize("Ofast,fast-math,unroll-loops") int MAX_N = 1E9 + 10; struct __attribute__((__packed__)) Node{ int sum; int push : 1; int left : 31; Node() { sum = 0; push = false; left = -1; } }; const int MAX_SZ = 1E7 + 10; int pt = 0; Node sum[MAX_SZ]; struct Tree{ void push(int ver, int left, int right) { if (!sum[ver].push) return; if (sum[ver].left == -1) { sum[pt++] = Node(), sum[ver].left = pt - 1; sum[pt++] = Node(); } int middle = (left + right) / 2; sum[sum[ver].left].sum = middle - left + 1; sum[sum[ver].left].push = 1; sum[sum[ver].left + 1].sum = right - middle; sum[sum[ver].left + 1].push = 1; sum[ver].push = 0; return; } int get_sum(int ver, int left, int right, int q_left, int q_right) { if (q_left > right || q_right < left) return 0; push(ver, left, right); if (left >= q_left && right <= q_right) return sum[ver].sum; int middle = (left + right) / 2; if (sum[ver].left == -1) { sum[pt++] = Node(), sum[ver].left = pt - 1; sum[pt++] = Node(); } return get_sum(sum[ver].left, left, middle, q_left, q_right) + get_sum(sum[ver].left + 1, middle + 1, right, q_left, q_right); } void update(int ver, int left, int right, int q_left, int q_right) { if (q_left > right || q_right < left) return; push(ver, left, right); if (left >= q_left && right <= q_right) { sum[ver].sum = right - left + 1; sum[ver].push = 1; push(ver, left, right); return; } int middle = (left + right) / 2; if (sum[ver].left == -1) { sum[pt++] = Node(), sum[ver].left = pt - 1; sum[pt++] = Node(); } update(sum[ver].left, left, middle, q_left, q_right); update(sum[ver].left + 1, middle + 1, right, q_left, q_right); sum[ver].sum = sum[sum[ver].left].sum + sum[sum[ver].left + 1].sum; } }; signed main() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int last = 0; int q; std::cin >> q; Tree tree; sum[pt++] = Node(); while (q--) { int type, x, y; std::cin >> type >> x >> y; x += last, y += last; if (type == 2) { tree.update(0, 0, MAX_SZ, x, y); } else { last = tree.get_sum(0, 0, MAX_SZ, x, y); std::cout << last << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...