std

Star 2022-10-28 8:03:29

#include <cstdio>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

const int SIZ = 1 << 20;

char buf[SIZ], *p1, *p2;

char gc() {
    if (p1 == p2) p1 = buf, p2 = buf + fread(buf, 1, SIZ, stdin);
    return p1 == p2 ? EOF : *p1++;
}

inline int read() {
    int f = 0, op = 1;
    char c = gc();
    while (!isdigit(c)) {
        if (c == '-') op = -1;
        c = gc();
    }
    while (isdigit(c)) f = (f << 1) + (f << 3) + (c ^ 48), c = gc();
    return f * op;
}

const int N = 100010;

vector<int> a;
unordered_map<int, int> mp;

struct SegmentTree
{
    int cnt[N * 4];

    void pushup(int u) {
        cnt[u] = cnt[u << 1] + cnt[u << 1 | 1];
    }

    void modify(int u, int l, int r, int x, int v) {
        if (l == r) {
            cnt[u] += v;
        }
        else {
            int mid = l + r >> 1;
            if (x <= mid) modify(u << 1, l, mid, x, v);
            else modify(u << 1 | 1, mid + 1, r, x, v);
            pushup(u);
        }
    }

    int get_rank(int u, int l, int r, int x) {
        if (l == r) return 1;
        else {
            int mid = l + r >> 1;
            if (x <= mid) return get_rank(u << 1, l, mid, x);
            else return cnt[u << 1] + get_rank(u << 1 | 1, mid + 1, r, x);
        }
    }

    int get_num(int u, int l, int r, int k) {
        if (l == r) return l;
        else {
            int mid = l + r >> 1;
            if (k <= cnt[u << 1]) return get_num(u << 1, l, mid, k);
            else return get_num(u << 1 | 1, mid + 1, r, k - cnt[u << 1]);
        }
    }
} smt;

struct Query
{
    int op, a;
} q[N];

int main() {
    // freopen("dat", "r", stdin);
    int n = read();
    for (int i = 1; i <= n; ++i) {
        q[i].op = read(), q[i].a = read();
        if (q[i].op == 1 || q[i].op == 2) a.push_back(q[i].a);
    }
    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());
    for (int i = 0; i < a.size(); ++i) {
        mp[a[i]] = i + 1;
    }
    int l = a.size();
    for (int i = 1; i <= n; ++i) {
        if (q[i].op == 1) {
            smt.modify(1, 1, l, mp[q[i].a], 1);
        }
        else if (q[i].op == 2) {
            smt.modify(1, 1, l, mp[q[i].a], -1);
        }
        else if (q[i].op == 3) {
            printf("%d\n", smt.get_rank(1, 1, l, mp[q[i].a]));
        }
        else {
            printf("%d\n", a[smt.get_num(1, 1, l, q[i].a) - 1]);
        }
    }
    return 0;
}

共 3 条回复

long_hao

tql

Laffey

tql

Star

突然发现我忘发了(