#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 条回复
tql
tql
突然发现我忘发了(