Submission #478790

#TimeUsernameProblemLanguageResultExecution timeMemory
478790MohammadAghilGrowing Trees (BOI11_grow)C++14
100 / 100
257 ms4552 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll const mod = 1e9 + 7, maxn = 1e5 + 5, inf = 1e18 + 5; int seg[maxn << 2], n, h[maxn], lazy[maxn << 2]; void pull(int x, int k){ seg[x] += k; lazy[x] += k; } void shift(int x){ pull(x << 1, lazy[x]); pull(x << 1 | 1, lazy[x]); lazy[x] = 0; } void upd(int l, int r, int x = 1, int lx = 0, int rx = n){ if(l <= lx && r >= rx){ pull(x, 1); return; } if(l >= rx || r <= lx) return; shift(x); int mid = (lx + rx) >> 1; upd(l, r, x << 1, lx, mid); upd(l, r, x << 1 | 1, mid, rx); seg[x] = max(seg[x << 1], seg[x << 1 | 1]); } int query(int k, int x = 1, int lx = 0, int rx = n){ if(lx + 1 == rx) { if(seg[x] > k) return lx; else return rx; } shift(x); int mid = (lx + rx) >> 1; if(seg[x << 1] > k) return query(k, x << 1, lx, mid); return query(k, x << 1 | 1, mid, rx); } int get(int i, int x = 1, int lx = 0, int rx = n){ if(lx + 1 == rx) return seg[x]; shift(x); int mid = (lx + rx) >> 1; if(i < mid) return get(i, x << 1, lx, mid); return get(i, x << 1 | 1, mid, rx); } void build(int x = 1, int lx = 0, int rx = n){ if(lx + 1 == rx){ seg[x] = h[lx]; return; } int mid = (lx + rx) >> 1; build(x << 1, lx, mid); build(x << 1 | 1, mid, rx); seg[x] = max(seg[x << 1], seg[x << 1 | 1]); } int main(){ int q; cin >> n >> q; for(int i = 0; i < n; i++) cin >> h[i]; sort(h, h + n); build(); while(q--){ char t; cin >> t; if(t == 'F'){ int c, h; cin >> c >> h; int fst = query(h - 1); if(fst == n) continue; int en = min(fst + c - 1, n - 1); int val = get(en); int l_val = query(val-1), r_val = query(val); if(fst < l_val) upd(fst, l_val); int k = en - l_val + 1; upd(r_val - k, r_val); }else{ int l, r; cin >> l >> r; cout << query(r) - query(l - 1) << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...