Cod sursa(job #372004)

Utilizator cristiprgPrigoana Cristian cristiprg Data 8 decembrie 2009 10:28:21
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#define DIM 200005
typedef int Heap[DIM];

Heap H, v, poz;
int n, index, N, k;

inline int father(int i)
{
	return i>>1;
}

inline int left_son(int i)
{
	return i<<1;
}

inline int right_son(int i)
{
	return (i<<1) + 1;
}

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

void percolate(int i)
{
	int este_heap = 0;
	while (!este_heap && i > 1)
	{
		
		if (v[ H[father(i)] ] > v[ H[i] ])
		{
			
			swap(H[father(i)], H[i]);
			swap(poz[H[father(i)]], poz[H[i]]);
			i >>= 1;
			
		}
		
		else
			este_heap = 1;
			
	}
}


void sift(int i)
{
	int este_heap = 0;
	while (!este_heap && 2 * i <= index)
	{
		if (v[ H[left_son(i)] ] < v[ H[i] ] || v[ H[right_son(i)] ] < v[ H[i] ])
		{
			if (v[ H[left_son(i)] ] < v[ H[right_son(i)] ])
				swap(v[ H[left_son(i)] ], v[ H[i] ]),   i <<= 1;
			else
				swap(v[ H[right_son(i)] ], v[ H[i] ]),swap(poz[H[right_son(i)]],poz[H[i]]), i <<= 1, ++i ;
		}
		
		else
			este_heap = 1;
	}
}

void add(int x)
{
	H[++index] = x;
	poz[x] = x;
	percolate(index);
}

void afisare()
{
	printf ("||------------||\n");
	for (int i = 1; i <= index; ++i)
		printf ("%3d ", i);
	printf ("\n");
	
	for (int i = 1; i <= index; ++i)
		printf("%3d ", H[i]);
	printf ("\n");
}

void heapsort()
{
	index = n;
	for (int i = 1; i <= n; ++i)
	{
		v[index] = H[1];
		H[1] = H[index--];
		sift(1);
		afisare();
	}
}

void sterge(int k)
{
	int i ;
	i = poz[ k ];
	H[i] = H[index--];
	
		if ( 2 * i <= index )
			if ( v[ H[i] ] > H [left_son(i)] || v[ H[i] ] > H [right_son(i)] )
				sift(i);
		
	
	
}

int main()
{
	FILE *f = fopen("heapuri.in", "r");
	FILE *fout = fopen("heapuri.out", "w");
	fscanf(f, "%d", &N);
	index = 0;
	for (int i = 1, cod, x; i <= N; ++i)
	{
		fscanf(f, "%d", &cod);
		if (cod == 1)
			fscanf(f, "%d", &x),v[++k] = x, add(k);
		else
			if (cod == 2)
				fscanf(f, "%d", &x), sterge(x);
			else
				fprintf(fout, "%d\n", v[ H[1] ]);
	}
	
	afisare();
	
//	heapsort();
	

	
	return 0;
}