Submission #914067

#TimeUsernameProblemLanguageResultExecution timeMemory
914067NK_Cake (CEOI14_cake)C++17
0 / 100
625 ms30108 KiB
// Success consists of going from failure to failure without loss of enthusiasm #include <bits/stdc++.h> using namespace std; #define nl '\n' #define f first #define s second #define mp make_pair #define sz(x) int(x.size()) template<class T> using V = vector<T>; using vi = V<int>; using pi = pair<int, int>; using vpi = V<pi>; struct Seg { const int ID = 0; int comb(int a, int b) { return max(a, b); } vi seg; int N; void init(int n) { for(N = 1; N < n; N *= 2); seg.assign(2*N, ID); } void pull(int x) { seg[x] = comb(seg[2*x], seg[2*x+1]); } void upd(int p, int x) { seg[p += N] = x; for(p /= 2; p; p /= 2) pull(p); } int query(int l, int r) { int ra = 0, rb = 0; for(l += N, r += N + 1; l < r; l /= 2, r /= 2) { if (l & 1) ra = comb(seg[l++], ra); if (r & 1) rb = comb(rb, seg[--r]); } return comb(ra, rb); } }; int main() { cin.tie(0)->sync_with_stdio(0); int N, P; cin >> N >> P; --P; Seg st; st.init(N); set<pi> ten; for(int i = 0; i < N; i++) { int x; cin >> x; if (i != P) { st.upd(i, x); ten.insert(mp(x, i)); } } while(sz(ten) > 10) ten.erase(begin(ten)); int Q; cin >> Q; for(int q = 0; q < Q; q++) { char c; cin >> c; if (c == 'F') { int x; cin >> x; --x; if (x == P) cout << 0 << nl; else if (x > P) { int mx = st.query(P, x); // find first mx > st.query(mid, P) int lo = 0, hi = P; while(lo < hi) { int mid = (lo + hi) / 2; if (mx > st.query(mid, P)) hi = mid; else lo = mid + 1; } // cout << "Q1: " << lo << " " << x << endl; cout << x - lo << nl; } else if (x < P) { int mx = st.query(x, P); // find lst where mx > st.query(P, mid) int lo = P, hi = N - 1; while(lo < hi) { int mid = (lo + hi + 1) / 2; if (mx > st.query(P, mid)) lo = mid; else hi = mid - 1; } // cout << "Q2: " << lo << " " << x << endl; cout << lo - x << nl; } } else { int i, e; cin >> i >> e; --i; set<int> add; int nx = 1e9; for(int t = 0; t < e; t++) { int x, idx; tie(x, idx) = *rbegin(ten); st.upd(idx, x + 1); nx = min(nx, x); ten.erase(prev(end(ten))); add.insert(idx); } st.upd(i, nx); ten.insert(mp(nx, i)); if (add.count(i)) add.erase(i); for(auto& idx : add) ten.insert(mp(st.query(idx, idx), idx)); while(sz(ten) > 10) ten.erase(begin(ten)); } } exit(0-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...