Pagini recente » Cod sursa (job #1615606) | Cod sursa (job #655310) | Cod sursa (job #2903171) | Cod sursa (job #1806583) | Cod sursa (job #1486678)
#include <stdio.h>
#include <stdlib.h>
int Heap[200001];
int cronologic[200001];
int poz[200001];
int n; //numarul operatiilor
int size=0; //dimensiune Heap
int x; //semnificatie enunt
int tip;
int parinte (int v) //v - pozitie
{
return v/2;
}
int fiu_stang(int v)
{
return v*2;
}
int fiu_drept(int v)
{
return v*2+1;
}
void sift (int v)
{
int son=0;
do
{
son=0;
if (fiu_stang(v)<=size)
{
son=fiu_stang(v);
if (fiu_drept(v)<=size && cronologic[Heap[fiu_drept(v)]]>cronologic[Heap[son]])
son=fiu_drept(v);
}
if (son!=0 && cronologic[Heap[v]]>cronologic[Heap[son]])
{
int aux = Heap[v]; // interschimbare in Heap a pozitiilor din cronologic a numerelor
Heap[v]=Heap[son];
Heap[son]=aux;
aux = poz[Heap[v]]; // interschimbare a pozitiilor catre locurile din Heap
poz[Heap[v]]=poz[Heap[son]];
poz[Heap[son]]=aux;
v=son;
}
}while(son);
}
void percolate (int v)
{
int parintele;
parintele = parinte(v);
if (parintele>=1 && cronologic[Heap[parintele]]>cronologic[Heap[v]]) // daca parintele = 0 e pe radacina
{
int aux=Heap[v];
Heap[v]=Heap[parintele];
Heap[parintele]=aux;
aux = poz[Heap[v]];
poz[Heap[v]]=poz[Heap[parintele]];
poz[Heap[parintele]]=aux;
percolate(parintele);
}
}
void add (int val,int index)
{
Heap[++size]=index;
cronologic[index]=val;
poz[index]=size;
percolate(size);
}
void cut (int v)
{
if (poz[v]==size)
size--;
else
{
Heap[poz[v]]=Heap[size--];
if (poz[v]>1 && cronologic[Heap[parinte(poz[v])]]>cronologic[Heap[poz[v]]])
percolate(poz[v]);
else
sift(poz[v]);
}
}
int main()
{
int i;
int indexCronologic=0;
FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");
fscanf(f,"%d",&n);
for (i=1;i<=n;i++)
{
fscanf(f,"%d",&tip);
switch(tip)
{
case 1:
{
fscanf(f,"%d",&x);
indexCronologic++;
add(x,indexCronologic);
break;
}
case 2:
{
fscanf(f,"%d",&x);
cut (x);
break;
}
case 3:
{
fprintf(g,"%d\n",cronologic[Heap[1]]);
break;
}
}
}
fclose(f);
fclose(g);
return 0;
}