Submission #110538

#TimeUsernameProblemLanguageResultExecution timeMemory
110538ckodserCake (CEOI14_cake)C++14
16.67 / 100
2054 ms15484 KiB
#include<bits/stdc++.h> using namespace std; const int N = 250005, MXS = 1 << 18; int n, q, st, A[N], MX[MXS * 2]; struct CMP { inline bool operator () (int i, int j) { return (A[i] < A[j]); } }; set < int , CMP > S; inline set < int > :: iterator GetEnd() { auto it = S.end(); it --; return it; } inline void Set(int i, int val) { for (i += MXS; i; i >>= 1) MX[i] = max(MX[i], val); } inline int Get(int le, int ri) { int Mx = 0; for (le += MXS, ri += MXS; le < ri; le >>= 1, ri >>= 1) { if (le & 1) Mx = max(Mx, MX[le ++]); if (ri & 1) Mx = max(Mx, MX[-- ri]); } return (Mx); } int GetR(int le, int val, int id = 1, int l = 0, int r = MXS) { /*if (r <= le || MX[id] <= val) return n; if (r - l < 2) return l; int res = GetR(le, val, id << 1, l, (l + r) >> 1); if (res < n) return (res); return (GetR(le, val, id << 1 | 1, (l + r) >> 1, r));*/ for (int i = le; i < n; i++) if (A[i] > val) return i; return n; } int GetL(int ri, int val, int id = 1, int l = 0, int r = MXS) { /*if (ri <= l || MX[id] <= val) return -1; if (r - l < 2) return l; int res = GetL(ri, val, id << 1 | 1, (l + r) >> 1, r); if (res > -1) return (res); return (GetL(ri, val, id << 1, l, (l + r) >> 1));*/ for (int i = ri - 1; i >= 0; i --) if (A[i] > val) return i; return -1; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> st; st --; for (int i = 0; i < n; i++) { cin >> A[i]; S.insert(i); Set(i, A[i]); } cin >> q; for (; q; q --) { char ch; int id, k; cin >> ch >> id; id --; if (ch == 'E') { cin >> k; vector < int > vec; for (int i = 0; i < k - 1; i++) vec.push_back(*GetEnd()), S.erase(GetEnd()); int a = A[*GetEnd()] + 1; S.erase(id); A[id] = a; S.insert(id); Set(id, A[id]); for (int i = k - 2; ~ i; i --) { a ++; A[vec[i]] = a; S.insert(vec[i]); Set(vec[i], A[vec[i]]); } assert((int)S.size() == n); continue; } if (id == st) printf("0\n"); else if (id < st) printf("%d\n", GetR(st + 1, Get(id, st)) - id - 1); else printf("%d\n", id - GetL(st, Get(st + 1, id + 1)) - 1); } 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...