Cod sursa(job #823589)

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

#define maxn 100001

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

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 p)
{
    int fiust = 2 * p ;
	int fiudr = 2 * p + 1 ;
	int pmin = p ;
    
	if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[pmin] ] )
        pmin = fiust ;
    
	if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[pmin] ] )
        pmin = fiudr ;
    
	if( p != pmin )
    {
        schimba( p , pmin ) ;
        coboara ( 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[++nrheap] = nr ;
            poz[nr] = nrheap ;
            urca ( nrheap ) ;
        }
        else
        {
            int aux = poz[x] ;
            schimba ( poz[x] , nrheap-- ) ;
            coboara ( aux ) ;
        }
		
    }

    return 0;
	
}