#include <iostream>
#include <string>
using namespace std;
const int N = 2e5 + 5, INF = 1e9 + 7;
struct node
{
int l, r, k, v, cnt, size;
} tr[N];
int idx, n, m, x, mid, root;
string op;
int get(int k)
{
tr[++idx].k = k, tr[idx].v = rand();
tr[idx].cnt = tr[idx].size = 1;
return idx;
}
void pushup(int u)
{
tr[u].size = tr[tr[u].l].size + tr[tr[u].r].size + tr[u].cnt;
}
void zig(int &p)
{
int q = tr[p].l;
tr[p].l = tr[q].r, tr[q].r = p, p = q;
pushup(tr[p].r), pushup(p);
}
void zag(int &p)
{
int q = tr[p].r;
tr[p].r = tr[q].l, tr[q].l = p, p = q;
pushup(tr[p].l), pushup(p);
}
void build()
{
get(-INF), get(INF), root = 1, tr[1].r = 2;
pushup(root);
if (tr[1].v < tr[2].v)
zag(root);
}
void insert(int &p, int k)
{
if (!p)
p = get(k);
else if (tr[p].k == k)
tr[p].cnt++;
else if (tr[p].k > k)
{
insert(tr[p].l, k);
if (tr[tr[p].l].v > tr[p].v)
zig(p);
}
else
{
insert(tr[p].r, k);
if (tr[tr[p].r].v > tr[p].v)
zag(p);
}
pushup(p);
}
int get_key(int p, int k)
{
if (!p)
return INF;
if (tr[tr[p].l].size >= k)
return get_key(tr[p].l, k);
if (tr[tr[p].l].size + tr[p].cnt >= k)
return tr[p].k;
return get_key(tr[p].r, k - tr[tr[p].l].size - tr[p].cnt);
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n, build();
for (int i = 1; i <= n; i++)
cin >> x, insert(root, x);
cin >> m;
while (m--)
{
cin >> op;
if (op == "add")
cin >> x, insert(root, x);
else
cout << get_key(root, (idx + 1) / 2) << "\n";
}
}
样例过了,题面给的那几个说明样例也过了,看着感觉没啥问题啊...
叫上去全红,并且错误信息大部分是第一行,小部分第二行,哪出问题了呢