Submission #1054506

#TimeUsernameProblemLanguageResultExecution timeMemory
1054506vako_pCake (CEOI14_cake)C++14
100 / 100
282 ms17212 KiB
#include <bits/stdc++.h> using namespace std; #define ll int #define pb push_back const int mxN = 1e6; ll n,a[2 * mxN],idx1[2 * mxN],q,st,mx,last[mxN],idx2[2 * mxN],mx1; struct segtree{ vector<pair<ll,ll>> v; ll sz = 1; void init(){ while(sz < n) sz *= 2; v.assign(2 * sz, {0LL, 0LL}); } void set(ll val, ll i, ll x, ll l, ll r){ if(r - l == 1){ v[x] = {val, i}; return; } ll mid = l + (r - l) / 2; if(i < mid) set(val, i, 2 * x + 1, l, mid); else set(val, i, 2 * x + 2, mid, r); v[x] = max(v[2 * x + 1], v[2 * x + 2]); } void set(ll val, ll i){ set(val, i, 0, 0, sz); } pair<ll,ll> find(ll l, ll r, ll x, ll lx, ll rx){ if(lx >= r or rx <= l) return {0, 0}; if(lx >= l and rx <= r) return v[x]; ll mid = lx + (rx - lx) / 2; return max(find(l, r, 2 * x + 1, lx, mid), find(l, r, 2 * x + 2, mid, rx)); } pair<ll,ll> find(ll l, ll r){ return find(l, r, 0, 0, sz); } pair<ll,ll> find1(ll val, ll l, ll r, ll op, ll x, ll lx, ll rx){ if(v[x].first <= val) return {-1, -1}; if(lx >= r or rx <= l) return {-1, -1}; if(rx - lx == 1){ if(v[x].first > val) return v[x]; return {-1, -1}; } ll mid = lx + (rx - lx) / 2; pair<ll,ll> ans = find1(val, l, r, op, 2 * x + 1 + op, ((!op) ? (lx) : (mid)), ((!op) ? (mid) : (rx))); if(ans.first > val) return ans; ans = find1(val, l, r, op, 2 * x + 2 - op, ((!op) ? (mid) : (lx)), ((!op) ? (rx) : (mid))); if(ans.first > val) return ans; return {-1, -1}; } pair<ll,ll> find1(ll val, ll l, ll r, ll op){ return find1(val, l, r, op, 0, 0, sz); } }; segtree s; void f(ll idx, ll val){ if(val == mx){ a[idx] = ++last[mx]; idx1[mx] = idx; idx2[idx] = mx; s.set(a[idx], idx); return; } if(mx1 == -1) mx1 = min(mx, idx2[idx]); a[idx] = last[val]; ll idx3 = idx1[val]; idx1[val] = idx; idx2[idx] = val; s.set(a[idx], idx); if(mx1 == val) return; if(idx3 != idx) f(idx3, val + 1); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> st; mx = min(10, n); st--; s.init(); for(int i = 0; i < n; i++){ cin >> a[i]; idx2[i] = n - a[i] + 1; if(n - a[i] <= mx - 2){ s.set(a[i] + mxN, i); last[n - a[i] + 1] = a[i] + mxN; idx1[n - a[i] + 1] = i; a[i] += mxN; } else s.set(a[i], i); if(n - a[i] == mx - 1){ idx1[n - a[i] + 1] = i; last[mx] = a[i]; } } cin >> q; while(q--){ char op; cin >> op; if(op == 'F'){ ll idx; cin >> idx; idx--; if(idx == st){ cout << 0 << '\n'; continue; } pair<ll,ll> x,x1; if(idx < st){ x = s.find(idx, st); x1 = s.find1(x.first, st + 1, n, 0); if(x1.first <= x.first) cout << n - 1 - idx << '\n'; else cout << x1.second - idx - 1 << '\n'; } else{ x = s.find(st + 1, idx + 1); x1 = s.find1(x.first, 0, st, 1); if(x1.first <= x.first) cout << idx << '\n'; else cout << idx - x1.second - 1 << '\n'; } } else{ ll idx,val; mx1 = -1; cin >> idx >> val; idx--; f(idx, val); // for(int i = 0; i < n; i++) cout << a[i] << ' '; // cout << '\n' << "--> "; // for(int i = 0; i < n; i++) cout << s.find(i, i + 1).first << ' '; // cout << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...