Pagini recente » Cod sursa (job #2119448) | Cod sursa (job #1289378) | Cod sursa (job #1720236) | Cod sursa (job #1446807) | Cod sursa (job #709916)
Cod sursa(job #709916)
#include<stdio.h>
using namespace std;
int heap[200002],poz[200002];
int tata(int nod)
{
return nod/2;
}
int fs(int nod)//fiu din stanga
{
return nod*2;
}
int fd(int nod)//fiu din dreapta
{
return nod*2+1;
}
void swap(int &a,int &b)
{
int aux;
aux=a;
a=b;
b=aux;
}
void sift(int n,int k)//mutam un nod ma jos daca este mai mare decat unul din fii sai
{
int x;
do
{
x=0;
if(fs(k) <= n)
{
x=fs(k);
if(fd(k) <=n && heap[fd(k)] < heap[x])
x=fd(k);
if(heap[x] > heap[k])
x=0;
}
if(x)
{
swap(heap[x],heap[k]);
swap(poz[x],poz[k]);
k=x;
}
}while(x);
}
void perc(int n,int k)//mutam un nod mai sus daca este mai mic decat tatal sau
{
int x;
x=heap[k];
while(k > 1 && x < heap[tata(k)])
{
heap[k]=heap[tata(k)];
swap(poz[k],poz[tata(k)]);
k=tata(k);
}
heap[k]=x;
}
void adaug(int &n,int k,int p)
{
n++;
poz[n]=p;
heap[n]=k;
perc(n,n);
}
void sterg(int &n,int k)
{
heap[k]=heap[n];
swap(poz[k],poz[n]);
n--;
if(k>1 && heap[k] < heap[tata(k)])
perc(n,k);
else
sift(n,k);
}
void rezolv()
{
int i,n,k,x,p,cod;
scanf("%d",&k);
n=0; p=0;
for(i=1;i<=k;i++)
{
scanf("%d",&cod);
if(cod==3)
{
printf("%d\n",heap[1]);
sterg(n,1);
}
else
{
scanf("%d",&x);
if(cod==1)
{
p++;
adaug(n,x,p);
}
else
sterg(n,poz[x]);
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
rezolv();
fclose(stdin);
fclose(stdout);
return 0;
}