Cod sursa(job #823583)

Utilizator matei_cChristescu Matei matei_c Data 25 noiembrie 2012 12:27:51
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

#define maxn 200005

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

int fiu_stanga(int unde)
{
	return 2 * unde ;
}

int fiu_dreapta(int unde)
{
	return 2 * unde + 1 ;
}

int tata(int unde)
{
	return unde / 2 ;
}

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

void urca(int unde)
{
	int sus = tata( unde ) ;
	
    while( sus && v[ heap[unde] ] < v[ heap[sus] ] )
    {
        schimba( unde, sus ) ;
        unde /= 2 ;
    }
}

void coboara(int unde)
{
    int fiust = fiu_stanga( unde ) ;
	int fiudr = fiu_dreapta( unde ) ;
	
	int ajunge = unde ;
    
	if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[ajunge] ] )
        ajunge = fiust ;
    
	if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[ajunge] ] )
        ajunge = fiudr ;
    
	if( unde != ajunge )
    {
        schimba( unde, ajunge ) ;
		coboara( ajunge ) ;
    }
	
}

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[++nrheap] = nr ;
            poz[nr] = nrheap ;
            urca( nrheap ) ;
        }
		
        else
        {
            int aux = poz[x] ;
			
			v[x] = -1 ;
			
			urca( poz[x] );
			poz[ heap[1] ] = 0 ;
			
			heap[1] = heap[ nrheap-- ] ;
			poz[ heap[1] ] = 1 ;
			
			if( nrheap > 1 )
				coboara( 1 ) ;
			/*
            schimba( poz[x], nrheap ) ;
			--nrheap ;
            coboara( aux ) ;
			*/
        }
		
    }

    return 0;
	
}