Pagini recente » Cod sursa (job #2957147) | Cod sursa (job #141395) | Cod sursa (job #2560643) | Cod sursa (job #2384251) | Cod sursa (job #1487933)
#include <stdio.h>
#include <stdlib.h>
int heap[200001];
int info[200001];
int poz[200001];
int n; //numarul operatiilor
int size=0; //dimensiune Heap
int x; //semnificatie enunt
int tip;
void swap (int a,int b)
{
int t=heap[a];
heap[a]=heap[b];
heap[b]=t;
}
void percolate (int k)
{
int tata = k >> 1; //k/2
while (tata && info[heap[tata]]>info[heap[k]])
{
poz[heap[tata]]=k;
poz[heap[k]]=tata;
swap(k,tata);
k=tata;
tata= k >> 1;
}
}
void sift (int k)
{
int fiu;
swap (size,k);
size--;
poz[heap[k]]=k;
while(k<=size)
{
if (k*2<=size)
{
fiu=k*2;
if (fiu+1<=size && info[heap[fiu+1]]<info[heap[fiu]])
fiu++;
}
else return;
if (info[heap[k]]>info[heap[fiu]])
{
poz[heap[fiu]]=k;
poz[heap[k]]=fiu;
swap(fiu,k);
k=fiu;
}
}
}
int main()
{
int i;
int k=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);
info[++k]=x;
heap[++size]=k;
poz[k]=size;
percolate(size);
break;
}
case 2:
{
fscanf(f,"%d",&x);
sift(poz[x]);
break;
}
case 3:
{
fprintf(g,"%d\n",info[heap[1]]);
break;
}
}
}
fclose(f);
fclose(g);
return 0;
}