Black Box
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11776 | Accepted: 4808 |
Description
Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are two types of transactions:
ADD (x): put element x into Black Box;
GET: increase i by 1 and give an i-minimum out of all integers containing in the Black Box. Keep in mind that i-minimum is a number located at i-th place after Black Box elements sorting by non- descending.
Let us examine a possible sequence of 11 transactions:
Example 1
It is required to work out an efficient algorithm which treats a given sequence of transactions. The maximum number of ADD and GET transactions: 30000 of each type.
Let us describe the sequence of transactions by two integer arrays:
1. A(1), A(2), ..., A(M): a sequence of elements which are being included into Black Box. A values are integers not exceeding 2 000 000 000 by their absolute value, M <= 30000. For the Example we have A=(3, 1, -4, 2, 8, -1000, 2).
2. u(1), u(2), ..., u(N): a sequence setting a number of elements which are being included into Black Box at the moment of first, second, ... and N-transaction GET. For the Example we have u=(1, 2, 6, 6).
The Black Box algorithm supposes that natural number sequence u(1), u(2), ..., u(N) is sorted in non-descending order, N <= M and for each p (1 <= p <= N) an inequality p <= u(p) <= M is valid. It follows from the fact that for the p-element of our u sequence we perform a GET transaction giving p-minimum number from our A(1), A(2), ..., A(u(p)) sequence.
ADD (x): put element x into Black Box;
GET: increase i by 1 and give an i-minimum out of all integers containing in the Black Box. Keep in mind that i-minimum is a number located at i-th place after Black Box elements sorting by non- descending.
Let us examine a possible sequence of 11 transactions:
Example 1
N Transaction i Black Box contents after transaction Answer (elements are arranged by non-descending) 1 ADD(3) 0 3 2 GET 1 3 3 3 ADD(1) 1 1, 3 4 GET 2 1, 3 3 5 ADD(-4) 2 -4, 1, 3 6 ADD(2) 2 -4, 1, 2, 3 7 ADD(8) 2 -4, 1, 2, 3, 8 8 ADD(-1000) 2 -1000, -4, 1, 2, 3, 8 9 GET 3 -1000, -4, 1, 2, 3, 8 1 10 GET 4 -1000, -4, 1, 2, 3, 8 2 11 ADD(2) 4 -1000, -4, 1, 2, 2, 3, 8
It is required to work out an efficient algorithm which treats a given sequence of transactions. The maximum number of ADD and GET transactions: 30000 of each type.
Let us describe the sequence of transactions by two integer arrays:
1. A(1), A(2), ..., A(M): a sequence of elements which are being included into Black Box. A values are integers not exceeding 2 000 000 000 by their absolute value, M <= 30000. For the Example we have A=(3, 1, -4, 2, 8, -1000, 2).
2. u(1), u(2), ..., u(N): a sequence setting a number of elements which are being included into Black Box at the moment of first, second, ... and N-transaction GET. For the Example we have u=(1, 2, 6, 6).
The Black Box algorithm supposes that natural number sequence u(1), u(2), ..., u(N) is sorted in non-descending order, N <= M and for each p (1 <= p <= N) an inequality p <= u(p) <= M is valid. It follows from the fact that for the p-element of our u sequence we perform a GET transaction giving p-minimum number from our A(1), A(2), ..., A(u(p)) sequence.
Input
Input contains (in given order): M, N, A(1), A(2), ..., A(M), u(1), u(2), ..., u(N). All numbers are divided by spaces and (or) carriage return characters.
Output
Write to the output Black Box answers sequence for a given sequence of transactions, one number each line.
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 a[30010], u[30010];
int main()
{
int n, m, i, j, k, x, ans;
while(~scanf("%d%d",&m,&n))
{
priority_queue<int, vector<int>, less<int> > q1; //队列中的元素从大到小排序
priority_queue<int, vector<int>, greater<int> > q2; //队列中的元素从小到大排序
for(i = 1; i <= m; i++)
scanf("%d",&a[i]);
for(j = 1; j <= n; j++)
scanf("%d",&u[j]);
i = 0;
j = k = 1;
while(j <= n)
{
if(i == u[j]) //弹出第k小的数
{
j++;
if(q1.size() < k) //q1里的元素不够k个
{
x = q2.top();
q1.push(x);
q2.pop();
}
ans = q1.top();
printf("%d\n",ans);
k++; //每次弹出一个数后,k的值都要加1
}
else
{
i++;
//q1里的元素不够k个
if(q1.size() < k)
{
q2.push(a[i]);
x = q2.top();
q2.pop();
q1.push(x); //先把a[i]压入q2,再从q2里取出最小值,压入q1
}
//如果q1的元素达到k个,且要压入队列的值比q1中的当前最大值大,说明q1中当前的最大值并不是第k小
else if(q1.top() > a[i])
{
x = q1.top();
q1.pop();
q2.push(x);
q1.push(a[i]);
}
//q1中的元素个数达到k个,且要压入队列的值比q1中的当前最大值小,说明q1中当前的最大值就是是第k小,则把a[i]直接压入que2中
else
{
q2.push(a[i]);
}
}
}
}
return 0;
}*/
/*
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
int a[30010];
int n,m,i,t;
priority_queue<int,vector<int>,less<int> >p;//大顶堆
priority_queue<int,vector<int>,greater<int> >q;//小顶堆;
while(cin>>n>>m)
{
for(i=0;i<n;i++)
cin>>a[i];
int flag=0;
int num;
while(m--)
{
cin>>num;
while(flag<num)//进优先队列没添加到一定数值时;
{
q.push(a[flag]);
flag++;
}
while(!p.empty()&&p.top()>q.top()) //保证P的元素一定比Q小
{
t=p.top();
p.pop();
p.push(q.top());
q.pop();
q.push(t);
}
printf("%d\n",q.top());
p.push(q.top());
q.pop();
}
}
}*/
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int main()
{
int a[30003];
int n,m,i;
while(cin>>n>>m)
{
for(i=0;i<n;i++)
cin>>a[i];
priority_queue<int,vector<int>,less<int> >q;
priority_queue<int,vector<int>,greater<int> >q1;
int flag=0;
while(m--)
{
int num;
cin>>num;
while(flag<num)
{
q1.push(a[flag]);
flag++;
}
while(!q.empty()&&q.top()>q1.top())
{
int t;
t=q.top();
q.pop();
q.push(q1.top());
q1.pop();
q1.push(t);
}
printf("%d\n",q1.top());
q.push(q1.top());
q1.pop();
}
}
}