Submission #491686

#TimeUsernameProblemLanguageResultExecution timeMemory
491686Yazan_AlattarCake (CEOI14_cake)C++14
0 / 100
407 ms6108 KiB
#include <iostream> #include <fstream> #include <vector> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <list> #include <utility> #include <cmath> #include <numeric> using namespace std; typedef long long ll; #define F first #define S second #define pb push_back #define endl "\n" #define all(x) x.begin(), x.end() const int M = 250007; const ll inf = 1e18; const ll mod = 1e9 + 7; const double pi = acos(-1); const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1}; int n, a, q, seg[4 * M], cur, pos[4 * M]; void upd(int i, int v, int node = 1, int l = 1, int r = n) { if(l == r){ seg[node] = v; return; } int mid = (l + r) / 2; if(i <= mid) upd(i, v, 2 * node, l, mid); else upd(i, v, 2 * node + 1, mid + 1, r); seg[node] = max(seg[2 * node], seg[2 * node + 1]); return; } int get(int st, int en, int node = 1, int l = 1, int r = n) { if(l > en || r < st) return 0; if(l >= st && r <= en) return seg[node]; int mid = (l + r) / 2; return max(get(st, en, 2 * node, l, mid), get(st, en, 2 * node + 1, mid + 1, r)); } int findr(int st, int en, int v, int node = 1, int l = 1, int r = n) { if(l > en || r < st || seg[node] < v) return -1; if(l == r) return l; int mid = (l + r) / 2; int ret = findr(st, en, v, 2 * node + 1, mid + 1, r); if(ret == -1) ret = findr(st, en, v, 2 * node, l, mid); return ret; } int findl(int st, int en, int v, int node = 1, int l = 1, int r = n) { if(l > en || r < st || seg[node] < v) return -1; if(l == r) return l; int mid = (l + r) / 2; int ret = findl(st, en, v, 2 * node, l, mid); if(ret == -1) ret = findl(st, en, v, 2 * node + 1, mid + 1, r); return ret; } int main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n >> a; for(int i = 1; i <= n; ++i){ int x; cin >> x; upd(i, x); pos[x] = i; } cur = n; cin >> q; while(q--){ char c; cin >> c; if(c == 'F'){ int x; cin >> x; if(x == a) cout << 0 << endl; else if(x > a){ int res = get(a + 1, x), ans = x - a; if(a != 1){ int add = findr(1, a - 1, res); if(add == -1) add = 0; ans += a - add - 1; } cout << ans << endl; } else{ int res = get(x, a - 1), ans = a - x; if(a != n){ int add = findl(a + 1, n, res); if(add == -1) add = n + 1; ans += add - a - 1; } cout << ans << endl; } } else{ int id, x; cin >> id >> x; x = cur - x + 2; for(int i = cur; i >= x; --i){ upd(pos[i], i + 1); pos[i + 1] = pos[i]; } upd(id, x); pos[x] = id; ++cur; } } return 0; } // Don't forget special cases. (n = 1?) // Look for the constraints. (Runtime array? overflow?)
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...