답안 #855981

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
855981 2023-10-02T13:23:37 Z Pannda Abracadabra (CEOI22_abracadabra) C++17
0 / 100
308 ms 26812 KB
#include <bits/stdc++.h>
using namespace std;

const int LOG = 20;

struct Fenwick {
    int n;
    vector<int> bit;
    vector<int> a;
    Fenwick(int n) : n(n), bit(n + 1, 0), a(n, 0) {}

    void add(int i, int delta) {
        a[i] += delta;
        for (i++; i <= n; i += i & -i) {
            bit[i] += delta;
        }
    }

    int sum(int i) {
        int res = 0;
        for (; i > 0; i -= i & -i) {
            res += bit[i];
        }
        return res;
    }

    int get(int i) {
        return a[i];
    }

    int kth(int k) {
        int sum = 0;
        int cur = 0;
        for (int i = LOG - 1; i >= 0; i--) {
            if (cur + (1 << i) <= n && sum + bit[cur + (1 << i)] <= k) {
                cur += (1 << i);
                sum += bit[cur];
            }
        }
        return cur;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;
    vector<int> a(n), ia(n);
    vector<vector<array<int, 2>>> mp(n + 1);
    vector<int> ans(q);

    for (int i = 0; i < n; i++) {
        cin >> a[i];
        a[i]--;
        ia[a[i]] = i;
    }

    for (int id = 0; id < q; id++) {
        int t, i;
        cin >> t >> i;
        i--;
        t = min(t, n);
        mp[t].push_back({ i, id });
    }

    Fenwick fen(n);
    for (int i = 0; i < n; ) {
        int anc = i;
        while (i < n && a[anc] >= a[i]) {
            i++;
        }
        int len = i - anc;
        fen.add(a[anc], len);
    }

    function<void()> cut = [&]() {
        int head = fen.kth(n / 2);
        int pos = fen.sum(head);
        int fromLen = fen.get(head);
        int toLen = n / 2 - pos;

        int newHead = a[ia[head] + toLen];
        int newLen = fromLen - toLen;

        fen.add(head, -fromLen + toLen);
        fen.add(newHead, newLen);
    };

    function<int(int)> kth = [&](int k) {
        int head = fen.kth(k);
        int pos = fen.sum(head);
        int toLen = k - pos;
        return a[ia[head] + toLen];
    };

    for (int t = 0; t <= n; t++) {
        for (auto [i, id] : mp[t]) {
            ans[id] = kth(i);
        }
        cut();
    }

    for (auto x : ans) {
        cout << x + 1 << '\n';
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 206 ms 18636 KB Output is correct
2 Correct 202 ms 16976 KB Output is correct
3 Correct 200 ms 16884 KB Output is correct
4 Correct 214 ms 15808 KB Output is correct
5 Correct 214 ms 19044 KB Output is correct
6 Correct 189 ms 19776 KB Output is correct
7 Incorrect 197 ms 19876 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 290 ms 26812 KB Output is correct
2 Correct 308 ms 26792 KB Output is correct
3 Correct 228 ms 22972 KB Output is correct
4 Correct 220 ms 23340 KB Output is correct
5 Correct 222 ms 24760 KB Output is correct
6 Correct 215 ms 23736 KB Output is correct
7 Incorrect 236 ms 26132 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 50 ms 7392 KB Output is correct
2 Correct 52 ms 6892 KB Output is correct
3 Correct 50 ms 6848 KB Output is correct
4 Correct 40 ms 6488 KB Output is correct
5 Correct 43 ms 6996 KB Output is correct
6 Correct 39 ms 6480 KB Output is correct
7 Incorrect 40 ms 6880 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 206 ms 18636 KB Output is correct
2 Correct 202 ms 16976 KB Output is correct
3 Correct 200 ms 16884 KB Output is correct
4 Correct 214 ms 15808 KB Output is correct
5 Correct 214 ms 19044 KB Output is correct
6 Correct 189 ms 19776 KB Output is correct
7 Incorrect 197 ms 19876 KB Output isn't correct
8 Halted 0 ms 0 KB -