Pagini recente » Cod sursa (job #1375531) | Cod sursa (job #2663258) | Cod sursa (job #2981046) | Cod sursa (job #1501965) | Cod sursa (job #331482)
Cod sursa(job #331482)
#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,f,aux;
memset(viz,0,sizeof(viz));
p=search(1);
k=p;
h[p]=h[h[0]];
h[0]--;
if (h[p]<h[p/2])
{
while (k>1 && h[k]<h[k/2])
{
aux=h[k];
h[k]=h[k/2];
h[k/2]=aux;
k=k/2;
}
}
else do
{
f=0;
if (2*k<=h[0])
{
f=h[2*k];
p=2*k;
if (2*k+1<=h[0])
if (f>h[2*k+1])
{
f=h[2*k+1];
p=2*k+1;
}
}
if (f)
{
if (h[k]>f)
{
aux=h[k];
h[k]=h[p];
h[p]=aux;
k=p;
}
else f=0;
}
}
while(f);
}
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("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
read();
rez();
return 0;
}