Cod sursa(job #643516)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 3 decembrie 2011 20:01:43
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<stdio.h>
#define nr_elemente 200001

using namespace std;

FILE *c,*d;
int heap[nr_elemente],r[nr_elemente],v[nr_elemente],n_r,n_h;

void swap(int &a,int &b)
{
	int aux;
	aux=a;
	a=b;
	b=aux;
}

void min_heapify_down(int i)
{
	int left,right,poz;
	poz=i;
	left=2*i;
	right=2*i+1;
	if(left<=n_h&&r[heap[left]]<r[heap[poz]])
		poz=left;
	if(right<=n_h&&r[heap[right]]<r[heap[poz]])
		poz=right;
	if(poz!=i)
	{
		swap(heap[i],heap[poz]);
		swap(v[heap[i]],v[heap[poz]]);
		min_heapify_down(poz);
	}
}

void min_heapify_up(int i)
{
	int p,poz;
	poz=i;
	p=i/2;
	if(p>=1&&r[heap[p]]>r[heap[poz]])
		poz=p;
	if(poz!=i)
	{
		swap(heap[i],heap[poz]);
		swap(v[heap[i]],v[heap[poz]]);
		min_heapify_up(poz);
	}
}

void insert_node(int x)
{
	n_r++;
	r[n_r]=x;
	n_h++;                                                     
	heap[n_h]=n_r;
	v[n_r]=n_h;
	min_heapify_up(n_h);
}

void delete_node(int i)
{
	heap[i]=heap[n_h];
	n_h--;
	if(i/2>=1&&r[heap[i/2]]>r[heap[i]])
		min_heapify_up(i);
	else
		if((2*i<=n_h&&r[heap[2*i]]<r[heap[i]])||(2*i+1<=n_h&&r[heap[2*i+1]]<r[heap[i]]))
			min_heapify_down(i);
}

int elementul_minim()
{
	return r[heap[1]];
}

int main()
{
	int n,i,a,b;
	n_h=0;
	n_r=0;
	c=fopen("heapuri.in","r");
	d=fopen("heapuri.out","w");
	fscanf(c,"%d",&n);
	for(i=1;i<=n;i++)
	{
		fscanf(c,"%d",&a);
		if(a==1)
		{
			fscanf(c,"%d",&b);
			insert_node(b);
		}
		else
			if(a==2)
			{
				fscanf(c,"%d",&b);
				delete_node(v[b]);
				v[b]=0;
			}
			else
				fprintf(d,"%d\n",elementul_minim());
	}
	fclose(c);
	fclose(d);
}