Cod sursa(job #1116454)

Utilizator PlatonPlaton Vlad Platon Data 22 februarie 2014 16:24:30
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>

#define maxn 200000

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

int pos[maxn];
int n, nr;

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)
{
    if(i/2>=1 && H[i/2].val>H[i].val)
	{
        swp(i,i/2);
        upheap(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(l);
}

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);
		if(op==1)
		{
			scanf("%d", &x);
			add(x);
		}
		if(op==2)
		{
			scanf("%d", &x);
			del(pos[x]);
		}
		if(op==3)
		{
			printf("%d\n", H[1].val);
		}
	}

	return 0;
}