Pagini recente » Cod sursa (job #248203) | Cod sursa (job #2978399) | Cod sursa (job #2064116) | Cod sursa (job #1991797) | Cod sursa (job #2089588)
#include <stdio.h>
#include <stdlib.h>
int Heap[1<<15];
int father(int nod)
{
return nod/2;
}
int left_son(int nod)
{
return nod*2;
}
int right_son(int nod)
{
return nod*2+1;
}
int min_heap(int Heap[])
{
return Heap[1];
}
void sift(int Heap[], int nod)
{
int son,aux;
do
{
son=0;
if(left_son(nod)<=Heap[0])
son=left_son(nod);
if(right_son(nod)<=Heap[0] && Heap[left_son(nod)]>Heap[right_son(nod)])
son=right_son(nod);
if(Heap[son]>Heap[nod])
son=0;
if(son)
{
aux=Heap[son];
Heap[son]=Heap[nod];
Heap[nod]=aux;
nod = son;
}
}while(son);
}
void percolate(int Heap[],int nod)
{
int key=Heap[nod];
while((nod>1) && (key<Heap[father(nod)]))
{
Heap[nod]=Heap[father(nod)];
nod=father(nod);
}
Heap[nod]=key;
}
void build_heap(int Heap[])
{
int i;
for(i=Heap[0]/2;i>0;--i)
sift(Heap,i);
}
void cut(int Heap[], int nod)
{
Heap[nod]=Heap[Heap[0]];
Heap[0]--;
if((nod>1) && Heap[nod]<Heap[father(nod)])
percolate(Heap,nod);
else sift(Heap,nod);
}
void insert(int Heap[],int value)
{
Heap[0]++;
Heap[Heap[0]]=value;
percolate(Heap,Heap[0]);
}
int main()
{
FILE *f=fopen("heapuri.in", "r");
FILE *g=fopen("heapuri.out", "w");
int i,j,x,y,n,adaugati[200001],counter=0,ok;
Heap[0]=0;
fscanf(f,"%d ", &n);
for(i=1;i<=n;i++)
{
fscanf(f,"%d", &x);
if(x==1)
{
fscanf(f,"%d", &y);
insert(Heap,y);
adaugati[++counter]=y;
}
else if(x==2)
{
ok=0;
fscanf(f,"%d", &y);
j=1;
while(j<=Heap[0] && !ok)
{
if(adaugati[y]==Heap[j])
ok=1;
else j++;
}
cut(Heap,j);
}
else fprintf(g,"%d\n", min_heap(Heap));
}
return 0;
}