Submission #1213401

#TimeUsernameProblemLanguageResultExecution timeMemory
1213401stefanneaguCake (CEOI14_cake)C++20
0 / 100
2096 ms20280 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int nmax = 5e5 + 1, inf = 1e9; int v[nmax]; int n; struct aint_in_4h57min30sec { int aint[nmax * 4]; int lz[nmax * 4]; void init(int nod = 1, int st = 1, int dr = n) { for (int i = 1; i <= n; i++) { aint[i] = v[i]; } } /* void prop(int nod, int st, int dr) { if (lz[nod] == 0) { return; } aint[nod] += lz[nod]; if (st != dr) { lz[nod * 2] += lz[nod]; lz[nod * 2 + 1] += lz[nod]; } lz[nod] = 0; } void hub(int nod, int st, int dr) { prop(nod, st, dr); if (st == dr) { return; } int mid = (st + dr) / 2; prop(nod * 2, st, mid); prop(nod * 2 + 1, mid + 1, dr); }*/ void setval(int i, int val) { assert(1 <= i && i <= n); aint[i] = val; } void upd(int l, int r, int val) { assert(l <= r); assert(1 <= l && r <= n); for (int i = l; i <= r; i++) { aint[i] += val; } } int qry(int l, int r) { assert(l <= r); assert(1 <= l && r <= n); int maxx = -inf; for (int i = l; i <= r; i++) { maxx = max(maxx, aint[i]); } return maxx; } } ds; bool in[nmax]; pair<int, int> t10[12]; int geti(int val) { for (int i = 1; i <= 10; i++) { if (t10[i].second < val) { return i; } } assert(0); } void push_t10(int poz, int val, int ind) { pair<int, int> ult = {poz, val}; in[poz] = 1; for (int i = ind; i <= 10; i++) { swap(t10[i], ult); } in[ult.first] = 0; } void erase_t10(int nr) { pair<int, int> ult = {0, 0}; in[nr] = 0; for (int i = 10; i >= 1; i--) { swap(t10[i], ult); if (ult.first == nr) { return; } } assert(0); } int pos1; int mare_dr(int val) { int l = pos1 + 1, r = n, ans = n + 1; while (l <= r) { int mid = (l + r) / 2; if (ds.qry(pos1 + 1, mid) > val) { ans = mid; r = mid - 1; } else { l = mid + 1; } } return ans; } int mare_st(int val) { int l = 1, r = pos1 - 1, ans = 0; while (l <= r) { int mid = (l + r) / 2; if (ds.qry(mid, pos1 - 1) > val) { ans = mid; l = mid + 1; } else { r = mid - 1; } } return ans; } void stanga(int i) { int vi = ds.qry(i, i); if (i == pos1 - 1) { int dr = mare_dr(vi); cout << dr - pos1 << '\n'; return; } int mval = ds.qry(i + 1, pos1 - 1); int dr_mx1 = mare_dr(mval); if (dr_mx1 == n + 1 || ds.qry(dr_mx1, dr_mx1) > vi) { cout << dr_mx1 - i - 1 << '\n'; return; } else { int max_dr = mare_dr(vi); cout << max_dr - i - 1 << '\n'; return; } } void dreapta(int i) { int vi = ds.qry(i, i); if (i == pos1 + 1) { int st = mare_st(vi); cout << pos1 - st << '\n'; return; } int mval = ds.qry(pos1 + 1, i - 1); int st_mx1 = mare_st(mval); if (st_mx1 == 0 || ds.qry(st_mx1, st_mx1) > vi) { cout << i - 1 - st_mx1 << '\n'; return; } else { int max_st = mare_st(vi); cout << i - 1 - max_st << '\n'; return; } } void chk() { int ult = 2 * inf; for (auto i = 1; i <= 10; i++) { if (t10[i].first == 0) { ult = -inf; } else { assert(ult > t10[i].second); ult = t10[i].second; } } } void norm() { map<int, int> N; int cnt = 0; for (int i = 1; i <= n; i++) { N[v[i]]; } for (auto &it : N) { it.second = ++cnt; } for (int i = 1; i <= n; i++) { v[i] = N[v[i]] + inf; } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> pos1; for (int i = 1; i <= n; i++) { cin >> v[i]; } v[pos1] = 0; norm(); for (int i = 1; i <= n; i++) { if (i == pos1) { continue; } if (t10[10].second < v[i]) { push_t10(i, v[i], geti(v[i])); } } v[pos1] = 0; ds.init(); int q; cin >> q; while (q--) { chk(); char t; cin >> t; if (t == 'E') { int i, poz; cin >> i >> poz; if (i == pos1) { continue; } if (in[i]) { erase_t10(i); } push_t10(i, t10[poz].second, poz); for (int j = poz + 1; j <= 10; j++) { t10[j].second--; } ds.upd(1, n, -1); for (int j = 1; j <= poz; j++) { ds.setval(t10[j].first, t10[j].second); } } else { int poz; cin >> poz; if (poz == pos1) { cout << "0\n"; continue; } if (poz < pos1) { stanga(poz); } else { dreapta(poz); } } } 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...