黑匣子
黑匣子
Description
我们使用黑匣子的一个简单模型。它能存放一个整数序列和一个特别的变量i。在初始时刻,黑匣子为空且i等于0。这个黑匣子执行一系列的命令。有两类命令:
(1)ADD(x):把元素x放入黑匣子;
(2)GET:i增1的同时,输出黑匣子内所有整数中第i小的数。
牢记第i小的数是当黑匣子中的元素以非降序排序后位于第i位的元素(输入数据保证每次GET命令中第i小的数必存在)
Input
输入的第1行只有一个整数n,表示有n条命令. 第2行至第n+1行,每行一条命令.
Output
输出中有若干行内容,每行一个整数,表示相应的get命令的输出.
Sample Input
11
ADD(3)
GET
ADD(1)
GET
ADD(-4)
ADD(2)
ADD(8)
ADD(-1000)
GET
GET
ADD(2)
Sample Output
3
3
1
2
HINT
对30%的数据,1≤n≤50000; 对100%的数据,1≤n≤500000; 对所有的数据,ADD命令输入的数在-10000至10000之间;
Source
#include<bits/stdc++.h>
using namespace std;
int s1[500001], s2[500001], len1 = 0,len2 = 0;
void s1_up(int p)
{
while(p>1&&s1[p/2]>s1[p])
{
swap(s1[p/2],s1[p]);
p=p/2;
}
return;
}
void s1_down(int p)
{
int lt;
while(1)
{
if(p*2>len1) return;
if(p*2==len1) lt=p*2;
else
{
if(s1[p*2]<s1[p*2+1])
lt=p*2;
else
lt=p*2+1;
}
if(s1[p]>s1[lt])
{
swap(s1[p],s1[lt]);
p=lt;
}
else break;
}
return;
}
void s1_insert(int key)
{
s1[++len1]=key;
s1_up(len1);
}
void s2_up(int p)
{
while(p>1&&s2[p/2]<s2[p])
{
swap(s2[p/2],s2[p]);
p=p/2;
}
return;
}
void s2_down(int p)
{
int lt;
while(1)
{
if(p*2>len2) return;
if(p*2==len2) lt=p*2;
else
{
if(s2[p*2]>s2[p*2+1])
lt=p*2;
else
lt=p*2+1;
}
if(s2[p]<s2[lt])
{
swap(s2[p],s2[lt]);
p=lt;
}
else break;
}
return;
}
void s2_insert(int key)
{
s2[++len2]=key;
s2_up(len2);
}
int main()
{
int n;
cin>>n;
char tmp[10];
gets(tmp);
int k=1;
for(int i=1;i<=n;i++)
{
char c;
scanf("%c",&c);
if(c=='A')
{
int x;
scanf("DD(%d)",&x);
gets(tmp);
if(x<s2[1]) s2_insert(x);
else s1_insert(x);
}
else
{
gets(tmp);
while(len2<k)
{
int x=s1[1];
s1[1]=s1[len1--];
s1_down(1);
s2_insert(x);
}
while(len2>k)
{
int x=s2[1];
s2[1]=s2[len2--];
s2_down(1);
s1_insert(x);
}
printf("%d\n",s2[1]);
k++;
}
}
return 0;
}