Cod sursa(job #761553)

Utilizator matei_cChristescu Matei matei_c Data 26 iunie 2012 14:57:00
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<algorithm>
using namespace std;

#define maxn 10001

int heap[maxn],poz[maxn],nh,nr,v[maxn] ;
int n,m ;

void schimba(int a,int b)
{
    swap ( heap[a] , heap[b] ) ;
    poz[ heap[a] ] = a ;
    poz[ heap[b] ] = b ;
}

void up(int p)
{
    while( p > 1 && v[ heap[p] ] < v[ heap[p/2] ] )
    {
        schimba ( p , p/2 ) ;
        p /= 2 ;
    }
}

void down(int p)
{
    int fiust = 2 * p ;
	int fiudr = 2 * p + 1 ;
	int pmin = p ;
    
	if( fiust <= nh && v[ heap[fiust] ] < v[ heap[pmin] ] )
        pmin = fiust ;
    
	if( fiudr <= nh && v[ heap[fiudr] ] < v[ heap[pmin] ] )
        pmin = fiudr ;
    
	if( p != pmin )
    {
        schimba( p , pmin ) ;
        down ( pmin ) ;
    }
	
}

int main()
{
	
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
		int op ;
        scanf("%d",&op);
        if( op==3 )
        {
            printf("%d\n",v[heap[1]]);
            continue;
        }
		int x ;
        scanf("%d",&x);
        if( op == 1 )
        {
            v[++nr] = x ;
            heap[++nh] = nr ;
            poz[nr] = nh ;
            up ( nh ) ;
        }
        else
        {
            int aux = poz[x] ;
            schimba ( poz[x] , nh-- ) ;
            down ( aux ) ;
        }
    }

    return 0;
	
}