Pagini recente » Cod sursa (job #192305) | Cod sursa (job #3234750) | Cod sursa (job #77737) | Cod sursa (job #94588) | Cod sursa (job #267390)
Cod sursa(job #267390)
// (min-)Heapuri
#include <cstdio>
int a[200000],p[200000],H[200000],cnt=0,lv=0;
void swap ( int i, int j)
{
int aux= h[i];
h[i]= h[j];
h[j]= aux;
p[h[i]]=i;
p[h[j]]=j;
}
void down ( int i) // cand subarborii sunt heapuri
{
int l,r,min;
do
{
l = 2*i ; // Stanga
r = 2*i +1 ;// Dreapta
if ( l<= dim_heap && a[h[l]]< A[h[i]] )
min= l;
else min= i;
if ( r<= dim_heap && A[h[r]]< A[h[i]] )
min= r;
if ( min!= i )
swap (i,min);
i= min;
} while (i!= min);
}
void up ( int i) //
{
if (i>1)
{
int pr= i/2,aux;
while ( A[h[i]] < A[h[pr]] )
{
swap (i,pr);
pr= i/2;
}
}//end.if
}
void insert ( int k)
{
h[cnt]=k;
p[k]=cnt;
up(cnt);
}
void cut (int i)
{
a[k]=0;
up (p[k]);
h[1]=h[cnt--];
p[h[1]]=1;
down(1);
}
int main()
{
freopen ("heapuri.in","r",stdin);
freopen ("heapuri.out","w",stdout);
int N, i, option,k,z=0;
scanf("%d", &N);
for( i= 1; i<= N; ++i)
{
scanf("%d", &option);
switch (option )
{
case 1:{
scanf("%d", &k);
a[++cnt]= k;
insert (cnt)
break;
}
case 2:{
scanf("%d", &k);
cut (k);
break;
}
case 3:{
printf("%d\n", a[h[1]] );
break;
}
}
}
fclose(stdout);
return 0;
}