Pagini recente » Cod sursa (job #1814639) | Cod sursa (job #1649717) | Cod sursa (job #2796555) | Cod sursa (job #1441334) | Cod sursa (job #260157)
Cod sursa(job #260157)
// (min-)Heapuri
#include <cstdio>
//#include <conio.h>
int A[200000],dim_heap;
int v[200000],lv=0;
void sift ( 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[l]< A[i] )
min= l;
else min= i;
if ( r<= dim_heap && A[r]< A[i] )
min= r;
if ( min!= i )
{
int aux= A[i];
A[i]= A[min];
A[min]= aux;
}
i= min;
} while (i!= min);
}
void percolate ( int i) //
{
int aux= A[i],pr= i/2;
while ( aux< A[pr] )
{
A[i]= A[pr];
i= pr;
pr= i/2;
}
A[i]= aux;
}
void insert ( int k)
{
A[++dim_heap]= k;
percolate(dim_heap);
}
int pozitie (int k)
{
for(int i= 1; i<= dim_heap; ++i)
if( k== A[i] ) return i;
return 0;
}
void cut (int i)
{if (i) {
A[i]= A[dim_heap];
--dim_heap;
int pr= i/2;
if( i> 1 && A[i]> A[pr] )
percolate (i);
else
sift (i);
}}
int main()
{
freopen ("heapuri.in","r",stdin);
freopen ("heapuri.out","w",stdout);
int N, i, option,k;
scanf("%d", &N);
for( i= 1; i<= N; ++i)
{
scanf("%d", &option);
switch (option )
{
case 1:{
scanf("%d", &k);
insert(k);
v[++lv]=k;
break;
}
case 2:{
scanf("%d", &k);
cut( pozitie(v[k]) );
break;
}
case 3:{
printf("%d\n", A[1] );
break;
}
}
}
// getch();
fclose(stdout);
return 0;
}