Cod sursa(job #606652)

Utilizator maritimCristian Lambru maritim Data 6 august 2011 18:35:33
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>

#define MaxN 200100
#define father (i / 2)
#define lf (i * 2)
#define rf (i * 2) + 1

typedef struct
{
	int info;
	int pos;
} Heap;

Heap A[MaxN];
int B[MaxN];
int N;
int stare;
int a;
int nr;
int Nr;

void ReconstituieHeap(int i)
{
	int max = i;
	if(lf <= nr && A[lf].info<A[max].info)
		max = lf;
	if(rf <= nr && A[rf].info<A[max].info)
		max = rf;
	if(max != i)
	{
		Heap a = A[i];
		A[i] = A[max];
		A[max] = a;
		B[A[i].pos] = i;
		B[A[max].pos] = max;
		ReconstituieHeap(max);
	}
}

void ReconstituieHeapUp(int a)
{
	int i;
	Heap b = A[a];
	for(i=a;i>1 && A[father].info>b.info;i=father)
	{
		A[i].info = A[father].info;
		A[i].pos = A[father].pos;
		B[A[i].pos] = i;
	}
	A[i] = b;
	B[b.pos] = i;
}

void InsereazaHeap(int a)
{
	int i;
	for(i=++nr;i>1 && A[father].info>a;i=father)
	{
		A[i].info = A[father].info;
		A[i].pos = A[father].pos;
		B[A[i].pos] = i;
	}
	A[i].info = a;
	A[i].pos = ++Nr;
	B[Nr] = i;
}

void StergeHeap(int a)
{
	A[a] = A[nr--];
	B[A[a].pos] = a;
	ReconstituieHeap(a);
	ReconstituieHeapUp(a);
}

int main()
{
	FILE *f = fopen("heapuri.in","r");
	FILE *g = fopen("heapuri.out","w");
	
	fscanf(f,"%d ",&N);
	for(int i=1;i<=N;i++)
	{
		fscanf(f,"%d ",&stare);
		switch(stare)
		{
		case 1 : {fscanf(f,"%d ",&a); InsereazaHeap(a);}
			break;
		case 2 : {fscanf(f,"%d ",&a); StergeHeap(B[a]);}
			break;
		case 3 : fprintf(g,"%d\n",A[1].info);
			break;
		}
	}
	
	fclose(g);
	fclose(f);
	return 0;
}