【题目描述】
Black Box是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black Box要处理一串命令。
命令只有两种:
ADD(x):把x元素放进Black Box;
GET:i加1,然后输出Black Box中第i小的数。
记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。例如:
我们来演示一下一个有11个命令的命令串。(如下图所示)
【输入格式】
第一行,两个整数,M,N。
第二行,M个整数,表示A(l)……A(M)。
第三行,N个整数,表示u(l)……u(N)。
【输出格式】
输出Black Box根据命令串所得出的输出串,一个数字一行。
S a m p l e I n p u t Sample~~Input Sample Input
7 4
3 1 -4 2 8 -1000 2
1 2 6 6
S a m p l e O u t p u t Sample~~Output Sample Output
3
3
1
2
【题意分析】
维护一棵splay,ADD就insert ()
,GET就是Kth ()
主席树、堆也可以做,这里再贴一个主席树的
splay code :
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define MAXN 400000
using namespace std;
int n, m, a[MAXN], f[MAXN], key, root, sz;
struct spaly {
int size[MAXN], son[MAXN][3], val[MAXN], father[MAXN], cnt[MAXN];
inline void maintain (int x) {
size[x] = size[son[x][0]] + size[son[x][1]] + cnt[x];
}
inline void rotate (int x) {
int y = father[x], z = father[y];
int k = son[y][1] == x, kk = son[z][1] =