제출 #375619

#제출 시각아이디문제언어결과실행 시간메모리
375619dolphingarlic케이크 (CEOI14_cake)C++14
100 / 100
598 ms13672 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; int d[250001], segtree[2][1000001]; void update(int *seg, int pos, int val, int node, int l, int r) { if (l == r) seg[node] = val; else { int mid = (l + r) / 2; if (pos > mid) update(seg, pos, val, node * 2 + 1, mid + 1, r); else update(seg, pos, val, node * 2, l, mid); seg[node] = max(seg[node * 2], seg[node * 2 + 1]); } } int range_max(int *seg, int a, int b, int node, int l, int r) { if (l > b || r < a) return 0; if (l >= a && r <= b) return seg[node]; int mid = (l + r) / 2; return max(range_max(seg, a, b, node * 2, l, mid), range_max(seg, a, b, node * 2 + 1, mid + 1, r)); } int walk(int *seg, int threshold, int node, int l, int r) { if (threshold > seg[node]) return r; if (l == r) return l - (seg[node] > threshold); int mid = (l + r) / 2; if (seg[node * 2] >= threshold) return walk(seg, threshold, node * 2, l, mid); return walk(seg, threshold, node * 2 + 1, mid + 1, r); } int main() { cin.tie(0)->sync_with_stdio(0); int n, a; cin >> n >> a; vector<int> top_ten; for (int i = 1; i <= n; i++) { cin >> d[i]; top_ten.push_back(i); } sort(top_ten.begin(), top_ten.end(), [](int A, int B) { return d[A] > d[B]; }); while (top_ten.size() > 10) top_ten.pop_back(); for (int i = a + 1; i <= n; i++) update(segtree[0], i - a, d[i], 1, 1, n - a); for (int i = a - 1; i; i--) update(segtree[1], a - i, d[i], 1, 1, a - 1); int q; cin >> q; while (q--) { char c; cin >> c; if (c == 'F') { int b; cin >> b; if (b == a) cout << "0\n"; else if (b > a) { int mx = range_max(segtree[0], 1, b - a, 1, 1, n - a); cout << walk(segtree[1], mx, 1, 1, a - 1) + b - a << '\n'; } else { int mx = range_max(segtree[1], 1, a - b, 1, 1, a - 1); cout << walk(segtree[0], mx, 1, 1, n - a) + a - b << '\n'; } } else { int i, e; cin >> i >> e; auto it = find(top_ten.begin(), top_ten.end(), i); if (it != top_ten.end()) top_ten.erase(it); for (int i = 0; i < e - 1; i++) { d[top_ten[i]]++; if (top_ten[i] > a) update(segtree[0], top_ten[i] - a, d[top_ten[i]], 1, 1, n - a); else if (top_ten[i] < a) update(segtree[1], a - top_ten[i], d[top_ten[i]], 1, 1, a - 1); } d[i] = d[top_ten[e - 1]] + 1; if (i > a) update(segtree[0], i - a, d[i], 1, 1, n - a); else if (i < a) update(segtree[1], a - i, d[i], 1, 1, a - 1); top_ten.insert(top_ten.begin() + e - 1, i); if (top_ten.size() > 10) top_ten.pop_back(); } } 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...