제출 #952310

#제출 시각아이디문제언어결과실행 시간메모리
952310ind1v원숭이와 사과 나무 (IZhO12_apple)C++11
0 / 100
86 ms159104 KiB
#include <bits/stdc++.h> using namespace std; const int M = 1e5 + 5; const int X = 1e9; struct dynamic_segment_tree { struct node { int l, r, cnt; bool lz; node() : l(-1), r(-1), cnt(0), lz(false) {} } t[50 * M]; int nd = 0, root; dynamic_segment_tree() { root = ++nd; } void push(int id, int tl, int tr) { int tm = (tl + tr) >> 1; if (t[id].l == -1) { t[id].l = ++nd; t[t[id].l].cnt = (t[id].lz ? tm - tl + 1 : 0); t[t[id].l].lz = t[id].lz; } if (t[id].r == -1) { t[id].r = ++nd; t[t[id].r].cnt = (t[id].lz ? tr - tm : 0); t[t[id].r].lz = t[id].lz; } } int get(int id, int tl, int tr, int l, int r) { if (l <= tl && tr <= r) { return t[id].cnt; } push(id, tl, tr); int tm = (tl + tr) >> 1; if (r <= tm) { return get(t[id].l, tl, tm, l, r); } else if (tm + 1 <= l) { return get(t[id].r, tm + 1, tr, l, r); } else { return get(t[id].l, tl, tm, l, r) + get(t[id].r, tm + 1, tr, l, r); } } void upd(int id, int tl, int tr, int l, int r) { if (l <= tl && tr <= r) { t[id].cnt = tr - tl + 1; t[id].lz = true; return; } push(id, tl, tr); int tm = (tl + tr) >> 1; if (r <= tm) { upd(t[id].l, tl, tm, l, r); } else if (tm + 1 <= l) { upd(t[id].r, tm + 1, tr, l, r); } else { upd(t[id].l, tl, tm, l, r); upd(t[id].r, tm + 1, tr, l, r); } t[id].cnt = t[t[id].l].cnt + t[t[id].r].cnt; } } dst; int m, c; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> m; while (m--) { int d, x, y; cin >> d >> x >> y; x += c; y += c; if (d == 1) { assert(1 <= x); assert(y <= X); c = dst.get(dst.root, 1, X, x, y); cout << c << '\n'; } else if (d == 2) { assert(1 <= x); assert(y <= X); dst.upd(dst.root, 1, X, x, y); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...