Cod sursa(job #823573)

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

#define maxn 100001

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)
{
    swap ( heap[a], heap[b] ) ;
    poz[ heap[a] ] = a ;
    poz[ heap[b] ] = b ;
}

void urca(int unde)
{
	int sus = tata( unde ) ;
	
    while( unde > 1 && 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] ;
            schimba( poz[x], nrheap ) ;
			--nrheap ;
            coboara(aux) ;
        }
		
    }

    return 0;
	
}