Cod sursa(job #641568)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 28 noiembrie 2011 21:11:38
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include<stdio.h>
#define nr_elem 200001

using namespace std;

int v[nr_elem],poz_heap;                                    // v[i] reprezinta pozitia al i-lea element in heap

void swap(int &a,int &b,int i1,int i2)
{
	int aux;
	aux=a;
	a=b;
	b=aux;
	aux=v[i1];
	v[i1]=v[i2];
	v[i2]=aux;
}
void min_heapify_down(int heap[nr_elem],int n,int i)
{
	int l,r,min,aux;
	l=2*i;
	r=2*i+1;
	min=i;
	if(l<=n&&heap[l]<heap[min])
		min=l;
	if(r<=n&&heap[r]<heap[min])
		min=r;
	if(min!=i)
	{
		swap(heap[i],heap[min],i,min);
		poz_heap=min;
		min_heapify_down(heap,n,min);
	}
}

void min_heapify_up(int heap[nr_elem],int n,int i)
{
	int p;
	p=i/2;
	if(p>=1&&heap[p]>heap[i])
	{
		swap(heap[i],heap[p],i,p);
		min_heapify_up(heap,n,p);
	}
}

void insert_node(int heap[nr_elem],int &n,int nr)
{
	n++;
	heap[n]=nr;poz_heap=n;
	min_heapify_up(heap,n,nr);
}

void delete_node(int heap[nr_elem],int &n,int poz)
{
	swap(heap[poz],heap[n],poz,n);
	n--;
	poz_heap=poz;
	if(poz/2>=1&&heap[poz]<heap[poz/2])
		min_heapify_up(heap,n,poz);
	else
		if((2*poz<=n&&heap[poz]>heap[2*poz])||(2*poz+1<=n&&heap[poz]>heap[2*poz+1]))
			min_heapify_down(heap,n,poz);
}


int elementul_minim(int heap[nr_elem],int n)
{
	return heap[1];
}



int main()
{
	int n,i,a,b,nr=0,r[nr_elem],h[nr_elem],nr_r=0;            // in r se pastreaza elementele in ordinea citirii lor
	FILE *c,*d;                                                   // h reprezinta vectorul care respecta structura de heap
	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);
			nr_r++;
			r[nr_r]=b;
			insert_node(h,nr,b);
			v[nr]=poz_heap;
		}
		else
			if(a==2)
			{
				fscanf(c,"%d",&b);
				delete_node(h,nr,v[b]);
				v[b]=v[nr+1];
			}
			else
				fprintf(d,"%d\n",elementul_minim(h,nr));
	}
	fclose(c);
	fclose(d);
}