제출 #391941

#제출 시각아이디문제언어결과실행 시간메모리
3919418e7케이크 (CEOI14_cake)C++14
100 / 100
902 ms9108 KiB
//Challenge: Accepted #include <iostream> #include <algorithm> #include <vector> #include <utility> #define ll long long #define maxn 250005 #define pii pair<int, int> #define ff first #define ss second #define io ios_base::sync_with_stdio(0); using namespace std; //#include <bits/extc++.h> //using namespace __gnu_pbds; //template<class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_upate>; int arr[maxn], a[2][maxn], orig[2][maxn]; pii big[11]; vector<pii> vec; int al, bl; struct segtree{ int seg[4 * maxn]; void init(int cur, int l, int r, int v[]) { if (r <= l) return; if (r - l == 1) { seg[cur] = v[l]; return; } int mid = (l + r) / 2; init(cur * 2, l, mid, v); init(cur * 2 + 1, mid, r, v); seg[cur] = max(seg[cur * 2], seg[cur * 2 + 1]); } void modify(int cur, int l, int r, int ind, int val) { if (r <= l) return; if (r - l == 1) { seg[cur] = val; return; } int mid = (l + r) / 2; if (ind < mid) modify(cur * 2, l, mid, ind, val); else modify(cur * 2 + 1, mid, r, ind, val); seg[cur] = max(seg[cur * 2], seg[cur * 2 + 1]); //cout << l << " " << r << " " << seg[cur] << endl; } int query(int cur, int l, int r, int ql, int qr) { if (r <= l || ql >= r || qr <= l) return 0; //cout << l << " " << r << " " << ql << " " << qr << endl; if (ql <= l && qr >= r) return seg[cur]; int mid = (l + r) / 2; return max(query(cur * 2, l, mid, ql, qr), query(cur * 2 + 1, mid, r, ql, qr)); } int search(int cur, int l, int r, int val, int num) { //cout << l << " " << r << " " << val << " " << seg[cur] << endl; if (r <= l) return l; if (r - l == 1) { return max(num, seg[cur]) < val ? r : l; } int mid = (l + r) / 2; if (max(num, seg[cur * 2]) < val) return search(cur * 2 + 1, mid, r, val, max(num, seg[cur * 2])); else return search(cur * 2, l, mid, val, num); } } sl, sr; int main() { io int n, st; cin >> n >> st; st--; al = st, bl = n - 1 - st; for (int i = 0;i < n;i++) { cin >> arr[i]; vec.push_back(make_pair(arr[i], i)); if (i < st) orig[0][st - i - 1] = arr[i]; //1 base else if (i > st) orig[1][i - st - 1] = arr[i]; } sort(vec.begin(), vec.end()); for (int i = max(0, n - 10);i < n;i++) { big[n - i - 1] = vec[i]; //0~9 } sl.init(1, 0, al, orig[0]); sr.init(1, 0, bl, orig[1]); int q; cin >> q; while (q--) { char type; cin >> type; if (type == 'E') { int ind, pos; cin >> ind>> pos; ind--, pos--; int orig = min(9, n - 1); for (int i = 0;i < min(10, n);i++) { if (big[i].ss == ind) { orig = i; break; } } int val = big[pos].ff + 1; for (int i = 0;i < pos;i++) { int id = big[i].ss; big[i].ff++; if (id < st) { //cout << "l " << st - id - 1 << " " << big[i].ff << endl; sl.modify(1, 0, al, st - id - 1, big[i].ff); } else if (id > st) { //cout << "r " << id - st - 1 << " " << big[i].ff << endl; sr.modify(1, 0, bl, id - st - 1, big[i].ff); } } for (int i = orig;i > pos;i--) big[i] = big[i - 1]; big[pos].ss = ind; big[pos].ff++; if (ind < st) { //cout << "l " << st - ind - 1 << " " << val << endl; sl.modify(1, 0, al, st - ind - 1, val); } else if (ind > st) { //cout << "r " << ind - st - 1 << " " << val << endl; sr.modify(1, 0, bl, ind - st - 1, val); } /* for (int i = 0;i < n;i++) { cout << big[i].ff << " " << big[i].ss << endl; } */ } else { int ind; cin >> ind; ind--; if (ind == st) { cout << 0 << "\n"; } else if (ind < st) { int p = st - ind - 1; int pref = sl.query(1, 0, al, 0, p + 1); cout << sr.search(1, 0, bl, pref, 0) + p + 1 << "\n"; } else { int p = ind - st - 1; int pref = sr.query(1, 0, bl, 0, p + 1); cout << sl.search(1, 0, al, pref, 0) + p + 1 << "\n"; } } } } /* 5 3 5 1 2 4 3 17 F 1 F 2 F 3 F 4 F 5 E 2 1 F 1 F 2 F 3 F 4 F 5 E 5 2 F 1 F 2 F 3 F 4 F 5 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...