Pagini recente » Cod sursa (job #2336388) | Cod sursa (job #2115264) | Cod sursa (job #1987128) | Cod sursa (job #2888077) | Cod sursa (job #395574)
Cod sursa(job #395574)
#include<stdio.h>
#define Nmax 200000
#define El_max 100000000
long n, Heap[Nmax], PozH[El_max], Timp[Nmax], nr_el_heap, nr_timp;
FILE *fin, *fout;
void interschimba(long &x, long &y)
{
long aux;
aux=x;
x=y;
y=aux;
}
//inserez el. x in heap ("urcare")
void insereaza(long Heap[Nmax], long x)
{
long i;
Heap[++nr_el_heap]=x;
PozH[x]=nr_el_heap;
Timp[++nr_timp]=x;
i=nr_el_heap;
while (i>0)
{
if (i/2)
if (Heap[i]<Heap[i/2])
{
interschimba(PozH[Heap[i]],PozH[Heap[i/2]]);
interschimba(Heap[i],Heap[i/2]);
}
i=i/2;
}
}
//sterg el. x din heap ("scufundare")
void sterge(long Heap[Nmax], long x)
{
int ok=0;
long i, min;
i=PozH[x];
PozH[x]=0;
Heap[i]=Heap[nr_el_heap--];
PozH[Heap[i]]=i;
while (i<=nr_el_heap/2 && !ok)
{
ok=1;
if (2*i<=nr_el_heap && Heap[i]>Heap[2*i])
min=2*i;
else min=i;
if (2*i+1<=nr_el_heap && Heap[2*i+1]<Heap[min])
min=2*i+1;
if (min!=i)
{
interschimba(PozH[Heap[i]],PozH[Heap[min]]);
interschimba(Heap[i],Heap[min]);
i=min, ok=0;
}
}
}
int main()
{
int op;
long i, el;
fin=fopen("heapuri.in","r");
fout=fopen("heapuri.out","w");
fscanf(fin,"%ld", &n);
nr_el_heap=0;
nr_timp=0;
for (i=1; i<=n; i++)
{
fscanf(fin,"%d",&op);
if (op==3)
fprintf(fout,"%ld \n",Heap[1]);
else
{
fscanf(fin,"%ld",&el);
if (op==1) insereaza(Heap,el);
else sterge(Heap,Timp[el]);
}
}
fclose(fout);
fclose(fin);
return 0;
}