Submission #1271882

#TimeUsernameProblemLanguageResultExecution timeMemory
1271882nerrrminMonkey and Apple-trees (IZhO12_apple)C++20
0 / 100
0 ms328 KiB
#include<bits/stdc++.h> #define endl '\n' #define pb push_back using namespace std; const long long maxn = 1e6 + 10; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } struct sparse_sgt { struct node { long long lt, rt, val, lazy; node() { lt = -1; rt = -1; val = 0; lazy = 0; }; node(long long _lt, long long _rt, long long _val, long long _lazy) { lt = _lt; rt = _rt; val = _val; lazy = _lazy; } }; long long n, tmr; vector < node > t; void init(long long sz) { n = sz; t.pb(node(-1, -1, 0, 0)); tmr = 1; } void push_lazy(long long i, long long l, long long r) { long long curr = t[i].lazy; if(curr == 0)return; if(l != r) { if(t[i].lt == -1) { t.pb(node(-1, -1, 0, 0)); t[i].lt = tmr; tmr ++; } if(t[i].rt == -1) { t.pb(node(-1, -1, 0, 0)); t[i].rt = tmr; tmr ++; } t[t[i].lt].lazy += curr; t[t[i].rt].lazy += curr; } t[i].val += t[i].lazy * (r - l + 1); t[i].lazy = 0; } long long query(long long i, long long l, long long r, long long ql, long long qr) { push_lazy(i, l, r); if(qr < l || ql > r)return 0; if(ql <= l && r <= qr) { return t[i].val; } long long mid = (l + r)/2; long long onleft = t[i].lt, ansleft = 0; if(onleft != -1)ansleft = query(onleft, l, mid, ql, qr); long long onright = t[i].rt, ansright = 0; if(onright != -1)ansright = query(onright, mid+1, r, ql, qr); return ansleft + ansright; } void update(long long i, long long l, long long r, long long ql, long long qr, long long upd_val) { //cout << i << " " << l << " " << r << endl; push_lazy(i, l, r); if(qr < l || ql > r)return; if(ql <= l && r <= qr) { t[i].lazy += upd_val; push_lazy(i, l, r); return; } long long mid = (l + r)/2; if(t[i].lt == -1) { t[i].lt = tmr; t.pb(node(-1, -1, 0, 0)); tmr ++; } if(t[i].rt == -1) { t[i].rt = tmr; t.pb(node(-1, -1, 0, 0)); tmr ++; } //cout << t[i].lt << " , " << t[i].rt << endl; update(t[i].lt, l, mid, ql, qr, upd_val); update(t[i].rt, mid+1, r, ql, qr, upd_val); t[i].val = t[t[i].lt].val + t[t[i].rt].val; } void do_update(long long ql, long long qr, long long upd_val) { update(0, 1, 1e9, ql, qr, upd_val); } long long do_query(long long ql, long long qr) { return query(0, 1, 1e9, ql, qr); } }; sparse_sgt s; int main() { speed(); long long q; cin >> q; s.init(1e9); long long c = 0; while(q --) { long long t, x, y; cin >> t >> x >> y; if(t == 1) { long long curr = s.do_query(x + c, y + c); c = curr; cout << curr << endl; } else { s.do_update(x + c, y + c, 1); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...