제출 #491695

#제출 시각아이디문제언어결과실행 시간메모리
491695Yazan_Alattar케이크 (CEOI14_cake)C++14
100 / 100
1026 ms18828 KiB
#include <iostream> #include <fstream> #include <vector> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <list> #include <utility> #include <cmath> #include <assert.h> #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 = 500007; 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}; set <int> s; int n, a, q, b[M], 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){ cin >> b[i]; upd(i, b[i]); s.insert(b[i]); pos[b[i]] = i; } cin >> q; while(q--){ char c; cin >> c; if(c == 'F'){ int x; cin >> x; if(x == a) cout << 0 << endl; else if(a == 1 || a == n) cout << abs(a - x) << endl; else if(x > a){ int res = get(a + 1, x), ans = x - a; 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; 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; vector <int> v; for(int i = 1; i < x; ++i){ v.pb(*(--s.end())); s.erase(--s.end()); } int val = 1; if(s.size()) val = *(--s.end()) + 1; reverse(all(v)); while(!v.empty()){ int cur = v.back(); int p = pos[cur]; v.pop_back(); pos[cur + 1] = p; b[p] = cur + 1; upd(p, cur + 1); s.insert(cur + 1); } s.erase(b[id]); b[id] = val; s.insert(val); pos[val] = id; upd(id, val); } } 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...