Description
有一个只能存放整数的序列叫“黑盒序列”,一开始序列为空。对于该序列,我们有ADD和GET两种操作:
ADD(x):表示往序列中添加一个值为x的整数;
GET(y):表示在第y次ADD操作后,取出序列中第k小的一个数,并将其输出。(k初值为1,每执行一次GET操作后,k的值会加1)
数列中的整数的绝对值不超过2,000,000,000
Input
第一行,两个整数N和M分别表示ADD和GET的操作次数(0<=N,M<=30000)
第二行,N个空格间隔的整数,表示每次ADD操作往数列中添加的数字
第三行,M个空格间隔的整数,其中第i个数get[i]表示在执行了get[i]次ADD操作后,执行一次GET操作。
Output
M行,每行一个整数,表示对应GET操作输出的值
Sample Input
7 4
3 1 -4 2 8 -1000 2
1 2 6 6
Sample Output
3
3
1
2
代码如下 :
#include<cstdio> #include<queue> using namespace std; int add[30005],get[30005]; priority_queue<int> big; priority_queue<int,vector<int> ,greater<int> >small; //small为小根堆;big为大根堆 int main(){ int i,k,n,m; scanf("%d%d",&n,&m); for(i=1;i<=n;i++)scanf("%d",&add[i]); for(i=1;i<=m;i++)scanf("%d",&get[i]); for(k=1;k<=m;k++){ for(i=get[k-1]+1;i<=get[k];i++) big.push(add[i]); while(big.size()>=k){ //执行完后big后只有k-1个; small.push(big.top()); big.pop(); } big.push(small.top()); //small.top()就是第k小数,退回big中 small.pop(); printf("%d\n",big.top()); } }