Submission #739935

#TimeUsernameProblemLanguageResultExecution timeMemory
739935aykhnMonkey and Apple-trees (IZhO12_apple)C++14
100 / 100
317 ms111196 KiB
#include <bits/stdc++.h> /* author: aykhn 5/1/2023 */ using namespace std; typedef long long ll; const int oo = INT_MAX; const ll ooo = LONG_MAX; const ll mod = 1e9 + 7; #define OPT ios_base::sync_with_stdio(0); \ cin.tie(0); \ cout.tie(0) #define pii pair<int,int> #define pll pair<ll,ll> #define pss pair<long,long> #define all(v) v.begin(), v.end() #define mpr make_pair #define pb push_back #define ts to_string #define fi first #define se second #define inf 0x3F3F3F3F #define infll 0x3F3F3F3F3F3F3F3FLL #define bpc __builtin_popcount #define print(v) for(int i = 0; i < v.size(); i++) cout << v[i] << " "; cout<<endl; struct Node { int data = 0; bool done = true; Node *left = nullptr; Node *right = nullptr; }; int c = 0; int sz = 1; void sett(int lx, int rx, int l, int r, Node *ptr) { if (l >= rx || r <= lx) return; if (l >= lx && r <= rx) { ptr -> data = r - l; ptr -> done = 0; return; } int mid = (l + r) >> 1; if (ptr -> left == nullptr) ptr -> left = new Node; sett(lx, rx, l, mid, ptr -> left); if (ptr -> right == nullptr) ptr -> right = new Node; sett(lx, rx, mid, r, ptr -> right); if (ptr -> done == 0 && ptr -> data > 0) { sett(l, mid, l, mid, ptr -> left); sett(mid, r, mid, r, ptr -> right); } ptr -> data = ptr -> left -> data + ptr -> right -> data; } int get(int lx, int rx, int l, int r, Node *ptr) { if (l >= rx || r <= lx) return 0; if (l >= lx && r <= rx) { return ptr -> data; } if (lx >= l && rx <= r && ptr -> data == r - l) return rx - lx; int mid = (l + r) >> 1; if (ptr -> done == 0 && ptr -> data > 0) { if (ptr -> left == nullptr) ptr -> left = new Node; sett(l, mid, l, mid, ptr -> left); if (ptr -> right == nullptr) ptr -> right= new Node; sett(mid, r, mid, r, ptr -> right); } int a, b; a = b = 0; if (ptr -> left != nullptr) a = get(lx, rx, l, mid, ptr -> left); if (ptr -> right != nullptr) b = get(lx, rx, mid, r, ptr -> right); return a + b; } int main() { OPT; int m; cin >> m; Node *root = new Node; while (sz < 1000000000) sz <<= 1; while (m--) { int x, l, r; cin >> x >> l >> r; if (x == 2) sett(l - 1 + c, r + c, 0, sz, root); else { int x = get(l - 1 + c, r + c, 0, sz, root); cout << x << endl; c = x; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...