Submission #230670

#TimeUsernameProblemLanguageResultExecution timeMemory
230670arborCake (CEOI14_cake)C++14
100 / 100
1758 ms15456 KiB
#include <bits/stdc++.h>

#define all(x) x.begin(), x.end()
#define lc (i << 1)
#define rc (i << 1 | 1)
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MN = 250005, LN = 17, MOD = 1e9 + 7, INF = 0x3f3f3f3f, BSZ = 320;
int N, a, d[MN], Q;
priority_queue<pii> pq;
int t[MN * 3];

void build(int i, int l, int r) {
    if (l == r) {
        t[i] = d[l];
        return;
    }
    int m = (l + r) / 2;
    build(lc, l, m);
    build(rc, m + 1, r);
    t[i] = max(t[lc], t[rc]);
}

void upd(int i, int l, int r, int idx, int val) {
    if (l > idx || r < idx) return;
    if (l == r) {
        d[idx] = val;
        t[i] = val;
        return;
    }
    int m = (l + r) / 2;
    upd(lc, l, m, idx, val);
    upd(rc, m + 1, r, idx, val);
    t[i] = max(t[lc], t[rc]);
}

int qry(int i, int l, int r, int ql, int qr) {
    if (l > qr || r < ql) return 0;
    if (l >= ql && r <= qr) return t[i];
    int m = (l + r) / 2;
    return max(qry(lc, l, m, ql, qr), qry(rc, m + 1, r, ql, qr));
}

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> N >> a;
    for (int i = 1; i <= N; i++) {
        cin >> d[i];
        pq.emplace(d[i], i);
    }
    build(1, 1, N);
    cin >> Q;
    for (int q = 1; q <= Q; q++) {
        char op;
        cin >> op;
        if (op == 'E') {
            int idx, rnk, val = 0;
            cin >> idx >> rnk;
            vector<pii> v;
            for (int i = 0; i < rnk - 1; i++) {
                while (d[pq.top().second] != pq.top().first) pq.pop();
                v.push_back(pq.top());
                pq.pop();
            }
            if (rnk == 1) val = N + q;
            else val = v.back().first;
            upd(1, 1, N, idx, val);
            pq.emplace(val, idx);
            for (pii p : v) {
                upd(1, 1, N, p.second, p.first + 1);
                pq.emplace(p.first + 1, p.second);
            }
        } else {
            int b;
            cin >> b;
            if (b == a) cout << 0 << '\n';
            else if (b < a) {
                int mx = qry(1, 1, N, b, a - 1);
                int l = a, r = N + 1;
                while (l < r) {
                    int m = (l + r) / 2;
                    if (qry(1, 1, N, a + 1, m) > mx) r = m;
                    else l = m + 1;
                }
                cout << l - 1 - b << '\n';
            } else {
                int mx= qry(1, 1, N, a + 1, b);
                int l = 1, r = a;
                while (l < r) {
                    int m = (l + r) / 2;
                    if (qry(1, 1, N, m, a - 1) < mx) r = m;
                    else l = m + 1;
                }
                cout << b - l << '\n';
            }
        }
    }
    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...