Submission #1324120

#TimeUsernameProblemLanguageResultExecution timeMemory
1324120sh_qaxxorov_571Monkey and Apple-trees (IZhO12_apple)C++20
100 / 100
295 ms137272 KiB
#include <iostream> #include <algorithm> using namespace std; /** * Dinamik Segment Tree - Har bir tugun kerak bo'lganda xotiradan joy oladi. * Vaqt murakkabligi: O(M log 10^9) * Xotira murakkabligi: O(M log 10^9) */ struct Node { int sum; int lazy; // 1 bo'lsa, ushbu oraliq to'liq pishgan Node *left, *right; Node() : sum(0), lazy(0), left(nullptr), right(nullptr) {} void push(int l, int r) { if (lazy) { int mid = l + (r - l) / 2; if (!left) left = new Node(); if (!right) right = new Node(); left->sum = (mid - l + 1); left->lazy = 1; right->sum = (r - mid); right->lazy = 1; lazy = 0; } } }; Node* root = new Node(); const int MAX_VAL = 1e9; void update(Node* curr, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) { curr->sum = (r - l + 1); curr->lazy = 1; return; } curr->push(l, r); int mid = l + (r - l) / 2; if (ql <= mid) { if (!curr->left) curr->left = new Node(); update(curr->left, l, mid, ql, qr); } if (qr > mid) { if (!curr->right) curr->right = new Node(); update(curr->right, mid + 1, r, ql, qr); } curr->sum = (curr->left ? curr->left->sum : 0) + (curr->right ? curr->right->sum : 0); } int query(Node* curr, int l, int r, int ql, int qr) { if (!curr) return 0; if (ql <= l && r <= qr) return curr->sum; curr->push(l, r); int mid = l + (r - l) / 2; int res = 0; if (ql <= mid) res += query(curr->left, l, mid, ql, qr); if (qr > mid) res += query(curr->right, mid + 1, r, ql, qr); return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int M; if (!(cin >> M)) return 0; int C = 0; while (M--) { int D, X, Y; cin >> D >> X >> Y; int ql = X + C; int qr = Y + C; if (D == 1) { C = query(root, 1, MAX_VAL, ql, qr); cout << C << "\n"; } else { update(root, 1, MAX_VAL, ql, qr); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...