제출 #1290388

#제출 시각아이디문제언어결과실행 시간메모리
1290388Cyanberry원숭이와 사과 나무 (IZhO12_apple)C++20
100 / 100
30 ms2644 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int mod = 1e9 + 7; struct Node { bool lset = false, rset = false, flagged = false; Node* left; Node* right; int lrange, rrange, val = 0; }; void fillNodes(Node* n) { int l = n->lrange, r = n->rrange; if (r - l > 1) { int m = (l+r)/2; if (!n->lset) { n->left = new Node(); n->left->lrange = l; n->left->rrange = m; n->lset = true; } if (!n->rset) { n->right = new Node(); n->right->lrange = m; n->right->rrange = r; n->rset = true; } } } void update(Node* n, int tl, int tr) { int l = n->lrange, r = n->rrange; if (l >= tr || r <= tl) return; if (l >= tl && r <= tr) { n->flagged = true; n->val = r - l; return; } if (n->flagged) return; fillNodes(n); update(n->left, tl, tr); update(n->right, tl, tr); if (!n->flagged) { n->val = n->left->val + n->right->val; } } int query(Node* n, int tl, int tr) { int l = n->lrange, r = n->rrange; if (l >= tr || r <= tl) return 0; if (n->flagged) { return min(r, tr) - max(l, tl); } if (l >= tl && r <= tr) return n->val; fillNodes(n); return query(n->left, tl, tr) + query(n->right, tl, tr); } Node* root = new Node(); int bruh = 0; signed main() { ios::sync_with_stdio(false); cin.tie(0); root->lrange = 0; root->rrange = (int)1e9; int N, a, b, c; cin>>N; for (int i = 0; i < N; ++i) { cin>>a>>b>>c; b += bruh, c += bruh; if (a == 1) { int smh = query(root, b - 1, c); cout<<smh<<'\n'; bruh = smh; } else if (a == 2) { update(root, b-1, c); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...