제출 #963504

#제출 시각아이디문제언어결과실행 시간메모리
963504Esgeer원숭이와 사과 나무 (IZhO12_apple)C++17
0 / 100
112 ms262144 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <unistd.h> using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #ifndef Local #pragma GCC optimize("O3,unroll-loops") #endif //#define int long long #define vi vector<int> #define vvi vector<vi> #define pii pair<int, int> #define vpi vector<pii> #define vvpi vector<vpi> #define vb vector<bool> #define vvb vector<vb> #define endl '\n' #define sp << " " << #define F(i, s, n) for(int i = s; i < n; i++) #define pb push_back #define fi first #define se second int mod = 1e9+7; int inf = 1e6; const int N = 1e5+5; struct Node { int sum, lazy, l, r, tl, tr; Node() : sum(0), lazy(0), l(-1), r(-1) {} }; Node t[64*N]; int idx = 0; void push(int node) { if(t[node].lazy == 0) return; t[node].sum = t[node].tr - t[node].tl + 1; int mid = (t[node].tl + t[node].tr) >> 1; if(t[node].l == -1) { t[node].l = ++idx; t[idx].tl = t[node].tl; t[idx].tr = mid; } if(t[node].r == -1) { t[node].r = ++idx; t[idx].tl = mid+1; t[idx].tr = t[node].tr; } t[t[node].l].lazy = 1; t[t[node].r].lazy = 1; t[node].lazy = 0; } void update(int node, int l, int r) { push(node); if(t[node].tl == l && t[node].tr == r) { t[node].lazy = 1; push(node); } else { int mid = (t[node].tl + t[node].tr) >> 1; if(t[node].l == -1) { t[node].l = ++idx; t[idx].tl = t[node].tl; t[idx].tr = mid; } if(t[node].r == -1) { t[node].r = ++idx; t[idx].tl = mid+1; t[idx].tr = t[node].tr; } if(l > mid) update(t[node].r, l, r); else if(r <= mid) update(t[node].l, l, r); else { update(t[node].l, l, mid); update(t[node].r, mid+1, r); } // REMOVED UNNECESSARY PUSH OPERATIONS t[node].sum = t[t[node].l].sum + t[t[node].r].sum; } } int query(int node, int l, int r) { push(node); if(t[node].tl == l && t[node].tr == r) return t[node].sum; int mid = (t[node].tl + t[node].tr) >> 1; if(t[node].l == -1) { t[node].l = ++idx; t[idx].tl = t[node].tl; t[idx].tr = mid; } if(t[node].r == -1) { t[node].r = ++idx; t[idx].tl = mid+1; t[idx].tr = t[node].tr; } if(l > mid) return query(t[node].r, l, r); else if(r <= mid) return query(t[node].l, l, r); else return query(t[node].l, l, mid) + query(t[node].r, mid+1, r); } void solve() { int n; cin >> n; t[0].tl = 0; t[0].tr = 1e9; t[0].sum = 0; t[0].lazy = 0; t[0].l = -1; t[0].r = -1; int c = 0; F(i, 0, n) { int type, a, b; cin >> type >> a >> b; if(type == 1) { c = query(0, a + c, b + c); cout << c << endl; } else update(0, a + c, b + c); } } void setIO() { ios_base::sync_with_stdio(0); cin.tie(0); #ifdef Local freopen("local.in", "r", stdin); freopen("local.out", "w", stdout); #else // freopen("poetry.in","r",stdin); // freopen("poetry.out","w",stdout); #endif } signed main() { setIO(); int t = 1; //cin >> t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...