题意::给定M个数,每次可以插入序列一个数;再给N个数,表示在插入第几个数时输出一个数,第一次输出序列中最小的,第二次输出序列中第二小的……以此类推,直到输出N个数。
用两个优先队列动态维护,因为插入第几个数时输出第i个最小,序列是动态的。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int a[30005],b[30005];
int main()
{
int n,m,i,j,k,x;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)cin>>a[i];
for(j=1;j<=m;j++)cin>>b[j];
priority_queue<int,vector<int>,less<int> >que1;//维护前K个数,从大到小
priority_queue<int,vector<int>,greater<int> >q2;//维护k+1到。。。从小到大
i=0;
j=k=1;
while(j<=m)
{
if(i==b[j])
{
j++;
if(que1.size()<k)
{
x=q2.top();
que1.push(x);
q2.pop();
}
cout<<que1.top()<<endl;
k++;
}
else
{
i++;
if(que1.size() < k)
{
q2.push(a[i]);
x=q2.top();
q2.pop();
que1.push(x);
}
else if(que1.top()>a[i])
{
x=que1.top();
que1.pop();
q2.push(x);
que1.push(a[i]);
}
else
{
q2.push(a[i]);
}
}
}
}
return 0;
}