Cod sursa(job #1116422)

Utilizator PlatonPlaton Vlad Platon Data 22 februarie 2014 15:48:23
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>

#define maxn 200000

struct heapItem
{
	int val, ind;
}H[maxn];

int l, nr;
int pos[maxn];
int n;

void swp(int a,int b)
{
    pos[H[a].ind]=b;
    pos[H[b].ind]=a;
    heapItem aux=H[a];
    H[a]=H[b];
    H[b]=aux;
}

void upheap(int i)
{
    while((H[i/2].val > H[i].val) && i/2>0)
	{
		swp(i, i/2);
		i/=2;
	}
}

void downheap(int i)
{
	if(
		(2*i+1 <= l) &&
		H[i].val > H[2*i+1].val &&
		H[2*i+1].val <=H [2*i].val)
	{
        swp(i,2*i+1);
        downheap(2*i+1);
    }
    else if(
			2*i<=l &&
			H[i].val>H[2*i].val)
	{
        swp(i,2*i);
        downheap(2*i);
    }
}

void add(int nod)
{
	pos[++nr] = ++l;
	H[l].val = nod;
	H[l].ind = nr;
	upheap(nr);
}

void del(int nod)
{
	swp(nod,l--);
    downheap(nod);
}

int main()
{
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);

	int op, x;
	scanf("%d", &n);
	while(n--)
	{
		scanf("%d", &op);
		switch(op)
		{
		case 1:
			scanf("%d", &x);
			add(x);
			break;
		case 2:
			scanf("%d", &x);
			del(pos[x]);
			break;
		case 3:
			printf("%d\n", H[1].val);
		}
	}

	return 0;
}