对顶堆
C++ 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int N=3e4+10,INF=1e8;
int a[N],b[N];
int main()
{
int n,m;
scanf("%d%d",&m,&n);
priority_queue<int > mmax;
priority_queue<int,vector<int>,greater<int> > mmin;
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
for(int i=1,j=1;j<=n;j++)
{
while(i<=b[j])//add
{
if(mmax.empty()||a[i]>=mmax.top()) mmin.push(a[i]);
else
{
mmin.push(mmax.top());
mmax.pop();
mmax.push(a[i]);
}
i++;
}
//get
mmax.push(mmin.top());
mmin.pop();
printf("%d\n",mmax.top());
}
return 0;
}