Cod sursa(job #881044)

Utilizator gener.omerGener Omer gener.omer Data 17 februarie 2013 17:36:08
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <algorithm>
#include <fstream>

using namespace std;

#define NMAX 200005

int A[NMAX], Heap[NMAX], Pos[NMAX], t = 0, n = 0;

int getLeft(int p){ return 2 * p;}
int getRight(int p){ return 2 * p + 1;}
int getParent(int p){return p/2;}

int getMin()
{
	return A[Heap[1]];
}

void up(int p)
{
	while(p > 1 && A[Heap[p]] < A[Heap[getParent(p)]]){
		swap(Heap[p], Heap[getParent(p)]);
		Pos[Heap[p]] = p;
		Pos[Heap[getParent(p)]] = getParent(p);
		p = getParent(p);
	}
}

void down(int p)
{
	int son;
	do{
		son = -1;
		if(getLeft(p) <= n)
		{
			son = getLeft(p);
			if(getRight(p) <= n && A[Heap[son]] > A[Heap[getRight(p)]])
				son = getRight(p);
		}
		
		if(son != -1)
		{
			if(A[Heap[son]] < A[Heap[p]])
			{
				swap(Heap[son], Heap[p]);
				Pos[Heap[son]] = son;
				Pos[Heap[p]] = p;
				p = son;
			}
			else
			{
				son = -1;
			}
		}
		
	}while(son != -1);
}


void insert(int x)
{
	++t, ++n;
	A[t] = x, Pos[t] = n, Heap[n] = t; 
	up(n);
}

void del(int x)
{
	/*A[x] =  1000000001;
	down(Pos[x]);
	--n;
	A[x] = -1;*/
	
	int pos = Pos[x];
    A[x] = -1;
    Pos[x] = -1;
 
    if(pos != n){
        Heap[pos] = Heap[n--];
        Pos[Heap[pos]] = pos;
 
        if(n > 1){
            if(pos > 1 && A[Heap[pos]] < A[Heap[getParent(pos)]])
                up(pos);
            else
				down(pos);
        }
    }
    else
        --n;
	
}

int main()
{
	freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
 
    int i, x, cod, N;
 
    scanf("%d ", &N);
 
    for (i=1; i<=N; i++)
    {
        scanf("%d ", &cod);
 
        if (cod == 1)
        {
            scanf("%d", &x);
            insert(x);
        }
 
        if (cod == 2)
        {
            scanf("%d", &x);
            del(x);
        }
 
        if (cod == 3){
            printf("%d\n", getMin());
        }
    }
	
	return 0;
}