Pagini recente » Cod sursa (job #2132796) | Cod sursa (job #2600523) | Cod sursa (job #2114182) | Cod sursa (job #1108692) | Cod sursa (job #330798)
Cod sursa(job #330798)
#include<stdio.h>
#include<string.h>
#define nmax 200010
long n,h[nmax],v[nmax],viz[nmax];
void read()
{
scanf("%ld",&n);
}
void ath()
{
long k,aux;
if (h[0]==0)
{
h[1]=v[v[0]];
h[0]++;
}
else {
h[++h[0]]=v[v[0]];
k=h[0];
while (h[k/2]>v[v[0]] && k/2!=0)
{
aux=h[k];
h[k]=h[k/2];
h[k/2]=aux;
k=k/2;
}
}
}
long search (long k)
{
long i;
viz[1]=1;
while (h[k]!=v[v[v[0]]])
{
if (2*k<=h[0])
{
if (h[2*k]<=v[v[v[0]]])
if (!viz[2*k])
{
k=2*k;
viz[k]=1;
}
else
if (2*k+1<=h[0])
if (h[2*k+1]<=v[v[v[0]]] && !viz[2*k+1])
{
k=2*k+1;
viz[k]=1;
}
else k=k/2;
else k=k/2;
else if (2*k+1<=h[0])
if (h[2*k+1]<=v[v[v[0]]] && !viz[2*k+1])
{
k=2*k+1;
viz[k]=1;
}
else k=k/2;
else k=k/2;
}
else k=k/2;
}
return k;
}
void elim()
{
long p,k;
memset(viz,0,sizeof(viz));
p=search(1);
k=p;
while (2*k<=h[0])
{
if (2*k+1<=h[0])
if (h[2*k]<h[2*k+1])
{
h[k]=h[2*k];
k=2*k;
}
else {
h[k]=h[2*k+1];
k=2*k+1;
}
else {
h[k]=h[2*k];
k=2*k;
}
}
long i,aux;
for (i=k+1;i<=h[0];i++)
{
h[i-1]=h[i];
k=i-1;
while (h[k/2]>h[k] && k/2!=0)
{
aux=h[k];
h[k]=h[k/2];
h[k/2]=aux;
k=k/2;
}
}
h[0]--;
}
void op(long cod)
{
switch (cod)
{
case 1:{ath();break;}
case 2:{elim();v[0]--;break;}
case 3:{printf("%ld\n",h[1]);break;}
}
}
void rez()
{
long i;
long cod;
for (i=1;i<=n;i++)
{
scanf("%ld",&cod);
if (cod!=3)
scanf("%ld",&v[++v[0]]);
op(cod);
}
}
int main()
{
freopen("grader_test2.in","r",stdin);
freopen("heapuri.out","w",stdout);
read();
rez();
return 0;
}