제출 #952332

#제출 시각아이디문제언어결과실행 시간메모리
952332ind1v원숭이와 사과 나무 (IZhO12_apple)C++11
100 / 100
165 ms128336 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[80 * M]; int nd = 0, root; dynamic_segment_tree() { root = ++nd; } void create(int id) { if (t[id].l == -1) { t[id].l = ++nd; } if (t[id].r == -1) { t[id].r = ++nd; } } void push(int id, int tl, int tr) { int tm = (tl + tr) >> 1; t[t[id].l].cnt = tm - tl + 1; t[t[id].l].lz = t[id].lz; t[t[id].r].cnt = tr - tm; 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; } create(id); if (t[id].lz) { 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; } create(id); if (t[id].lz) { 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) { c = dst.get(1, 1, X, x, y); cout << c << '\n'; } else if (d == 2) { dst.upd(1, 1, X, x, y); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...