Submission #451950

#TimeUsernameProblemLanguageResultExecution timeMemory
451950ilmarMonkey and Apple-trees (IZhO12_apple)C++17
100 / 100
568 ms207772 KiB
#include <bits/stdc++.h> using namespace std; class SegmentTree { public: struct Node { long long val; long long lzAdd; long long lzSet; struct Node *left, *right; }; Node *root = new Node; SegmentTree() { } ~SegmentTree() { } void expand(Node *v) { if (v->left == NULL) v->left = new Node; if (v->right == NULL) v->right = new Node; } void push(Node *v, long long l, long long m, long long r) { expand(v); if (v->lzSet != 0) { v->left->lzSet = v->lzSet; v->right->lzSet = v->lzSet; v->left->val = v->lzSet * (m - l + 1); v->right->val = v->lzSet * (r - m); v->left->lzAdd = v->right->lzAdd = 0; v->lzSet = 0; } v->left->lzAdd += v->lzAdd; v->right->lzAdd += v->lzAdd; v->left->val += v->lzAdd * (m - l + 1); v->right->val += v->lzAdd * (r - m); v->lzAdd = 0; } long long sum(Node *v, long long tl, long long tr, long long l, long long r) { if (l > r) return 0; if (l == tl && r == tr) return v->val; long long tm = (tl + tr) / 2; push(v, tl, tm, tr); return sum(v->left, tl, tm, l, min(r, tm)) + sum(v->right, tm + 1, tr, max(l, tm + 1), r); } void update_add(Node *v, long long tl, long long tr, long long l, long long r, long long add) { if (l > r) return; if (l == tl && r == tr) { v->lzAdd += add; v->val += (tr - tl + 1) * add; } else { long long tm = (tl + tr) / 2; push(v, tl, tm, tr); update_add(v->left, tl, tm, l, min(tm, r), add); update_add(v->right, tm + 1, tr, max(l, tm + 1), r, add); v->val = v->left->val + v->right->val; } } void update_assign(Node *v, long long tl, long long tr, long long l, long long r, long long new_val) { if (l > r) return; if (l == tl && r == tr) { v->lzSet = new_val; v->lzAdd = 0; v->val = new_val * (tr - tl + 1); } else { long long tm = (tl + tr) / 2; push(v, tl, tm, tr); update_assign(v->left, tl, tm, l, min(tm, r), new_val); update_assign(v->right, tm + 1, tr, max(l, tm + 1), r, new_val); v->val = v->left->val + v->right->val; } } }; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int m; const int n = 1e9; cin >> m; SegmentTree st = SegmentTree(); int c = 0; while (m--) { int d, x, y; cin >> d >> x >> y; x--, y--; x += c; y += c; if (d == 1) { int red = st.sum(st.root, 0, n - 1, x, y); cout << red << endl; c = red; } else { st.update_assign(st.root, 0, n - 1, x, y, 1); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...