제출 #597769

#제출 시각아이디문제언어결과실행 시간메모리
597769Shreyan_Paliwal원숭이와 사과 나무 (IZhO12_apple)C++17
0 / 100
18 ms980 KiB
// #include <bits/stdc++.h> // #define FOR(i, x, y) for (int i = x; i < y; i++) // typedef long long ll; // using namespace std; // struct Node { // int sum, lazy, tl, tr, l, r; // Node() : sum(0), lazy(0), l(-1), r(-1) {} // }; // const int MAXN = 123456; // Node segtree[64 * MAXN]; // int cnt = 2; // void push_lazy(int node) { // if (segtree[node].lazy) { // segtree[node].sum = segtree[node].tr - segtree[node].tl + 1; // int mid = (segtree[node].tl + segtree[node].tr) / 2; // if (segtree[node].l == -1) { // segtree[node].l = cnt++; // segtree[segtree[node].l].tl = segtree[node].tl; // segtree[segtree[node].l].tr = mid; // } // if (segtree[node].r == -1) { // segtree[node].r = cnt++; // segtree[segtree[node].r].tl = mid + 1; // segtree[segtree[node].r].tr = segtree[node].tr; // } // segtree[segtree[node].l].lazy = segtree[segtree[node].r].lazy = 1; // segtree[node].lazy = 0; // } // } // void update(int node, int l, int r) { // push_lazy(node); // if (l == segtree[node].tl && r == segtree[node].tr) { // segtree[node].lazy = 1; // push_lazy(node); // } else { // int mid = (segtree[node].tl + segtree[node].tr) / 2; // if (segtree[node].l == -1) { // segtree[node].l = cnt++; // segtree[segtree[node].l].tl = segtree[node].tl; // segtree[segtree[node].l].tr = mid; // } // if (segtree[node].r == -1) { // segtree[node].r = cnt++; // segtree[segtree[node].r].tl = mid + 1; // segtree[segtree[node].r].tr = segtree[node].tr; // } // if (l > mid) // update(segtree[node].r, l, r); // else if (r <= mid) // update(segtree[node].l, l, r); // else { // update(segtree[node].l, l, mid); // update(segtree[node].r, mid + 1, r); // } // push_lazy(segtree[node].l); // push_lazy(segtree[node].r); // segtree[node].sum = segtree[segtree[node].l].sum + segtree[segtree[node].r].sum; // } // } // int query(int node, int l, int r) { // push_lazy(node); // if (l == segtree[node].tl && r == segtree[node].tr) // return segtree[node].sum; // else { // int mid = (segtree[node].tl + segtree[node].tr) / 2; // if (segtree[node].l == -1) { // segtree[node].l = cnt++; // segtree[segtree[node].l].tl = segtree[node].tl; // segtree[segtree[node].l].tr = mid; // } // if (segtree[node].r == -1) { // segtree[node].r = cnt++; // segtree[segtree[node].r].tl = mid + 1; // segtree[segtree[node].r].tr = segtree[node].tr; // } // if (l > mid) // return query(segtree[node].r, l, r); // else if (r <= mid) // return query(segtree[node].l, l, r); // else // return query(segtree[node].l, l, mid) + query(segtree[node].r, mid + 1, r); // } // } // int main() { // iostream::sync_with_stdio(false); // cin.tie(0); // int m; // cin >> m; // segtree[1].sum = 0; // segtree[1].lazy = 0; // segtree[1].tl = 1; // segtree[1].tr = 1e9; // int c = 0; // for (int i= 0; i < m;) { // int d, x, y; // cin >> d >> x >> y; // if (d == 1) { // c = query(1, x + c, y + c); // cout << c << '\n'; // } else // update(1, x + c, y + c); // } // return 0; // } #include <bits/stdc++.h> using namespace std; struct Node { int v = 0, l, r; Node* c[2] = { nullptr, nullptr }; bool f() { return (v == (r - l + 1)); } Node* ML() { if (c[0]) return c[0]; c[0] = new Node; int m = (l + r) >> 1; c[0]->l = l, c[0]->r = m; if (f()) c[0]->set(); return c[0]; } Node* MR() { if (c[1]) return c[1]; c[1] = new Node; int m = (l + r) >> 1; c[1]->l = m + 1, c[1]->r = r; if (f()) c[1]->set(); return c[1]; } void set() { v = (r - l + 1); } int val(int k) { return (c[k] ? c[k]->v : 0); } void merge() { v = val(0) + val(1); } void push() { if (!f()) return; if (l != r) { if (c[0]) c[0]->set(); if (c[1]) c[1]->set(); } } void upd(int L, int R) { push(); if (R < l || r < L) return; if (L <= l && r <= R) { set(); return; } ML()->upd(L, R); MR()->upd(L, R); merge(); } int qry(int L, int R) { push(); if (R < l || r < L) return 0; if (L <= l && r <= R) return v; return ML()->qry(L, R) + MR()->qry(L, R); } }; int n; int main() { // freopen("main.in", "r", stdin); Node* seg = new Node; seg->l = 1, seg->r = 100000; cin >> n; int c = 0; for (int i = 0; i < n; i++) { int D, X, Y; cin >> D >> X >> Y; if (D == 2) seg->upd(X + c, Y + c); else { c = seg->qry(X + c, Y + c); cout << c << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...