Cod sursa(job #593592)

Utilizator qwertyuPeter Eke qwertyu Data 3 iunie 2011 17:41:47
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#define _CRT_SECURE_NO_DEPRECATE

#include <stdlib.h>
#include <stdio.h>

FILE static *fi,*fo;

int static heap[200000],num,ri[200000],at[200000],atnum;

inline int father(int x) { return x/2; }
inline int son_left(int x) { return x*2; }
inline int son_right(int x) { return x*2+1; }
inline int min() {return heap[1];}

//static func
inline void swp(int a,int b)
{
	int register c; 
	c=heap[a]; 
	heap[a]=heap[b]; 
	heap[b]=c;
	c=ri[a];
	ri[a]=ri[b];
	ri[b]=c;
	c=at[ri[a]];
	at[ri[a]]=at[ri[b]];
	at[ri[b]]=c;
}
inline void sift(int x)
{
	while (1)
	{
		int a,b;
		a=son_left(x);
		b=a+1;
		if (a>num) break;
		else 
			if(b>num) 
				if (heap[x]>heap[a]) {swp(x,a); x=a;}
				else break;
			else 
				if(heap[x]>heap[a])
					if (heap[b]<heap[a]) {swp(x,b); x=b;}
					else {swp(x,a); x=a;}
				else
					if(heap[x]>heap[b]) {swp(x,b); x=b;}
					else break;
	}
}
inline void percolate(int x)
{
	int a;
	while ((heap[a=father(x)]>heap[x])&&x>1)
	{
		swp(a,x);
		x=a;
	}
}

inline void add(int x)
{
	num++;
	atnum++;
	heap[num]=x;
	ri[num]=atnum;
	at[atnum]=num;
	percolate(num);
}

inline void cut(int x)
{
	swp(x,num);
	heap[num]=0;
	at[ri[num]]=0;
	ri[num]=0;
	num--;
	sift(x);
}

int main()
{
	fi = fopen("heapuri.in","r");
	fo = fopen("heapuri.out","w");

	int a,b,n;
	fscanf(fi,"%d",&n);
	while (n--)
	{
		fscanf(fi,"%d",&a);
		if (a == 1)
		{
			fscanf(fi,"%d",&b);
			add(b);
		}
		if (a == 2)
		{
			fscanf(fi,"%d",&b);
			cut(at[b]);
		}
		if (a == 3)
		{
			fprintf(fo,"%d\n",min());
		}
	}
	
	fclose(fi);
	fclose(fo);
	return 0;
}