Cod sursa(job #2186895)

Utilizator arcoC. Nicolae arco Data 26 martie 2018 01:49:40
Problema Heapuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.06 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

typedef unsigned int uint;

uint heap[200007];
uint pos[200007];
uint idx = 1;

#define father(i) (i / 2)
#define left(i) (2 * i)
#define right(i) (2 * i + 1)

uint percolate(uint kpos);
void sift(uint kpos);
uint add(uint data);
void cut(uint kpos);
void heapify();

int main(void)
{
	FILE *in =  fopen("C:/Users/arco/Desktop/code/ads.txt", "r");
	FILE *out = fopen("C:/Users/arco/Desktop/code/out.txt", "w");

	if(in != NULL && out != NULL)
	{
		uint n, i = 0, dx = 1;
		fscanf(in, "%u%*c", &n);
		for(; i < n; i++)
		{
			uint t;
			fscanf(in, "%u%*c", &t);
			if(t == 1)
			{
				uint x;
				fscanf(in, "%u%*c", &x);
				uint k = add(x);
				pos[dx++] = k;
			}
			else if(t == 2)
			{
				uint x;
				fscanf(in, "%u%*c", &x);
				cut(pos[x]);
			}
			else
			{
				fprintf(out, "%u\n", heap[1]);
			}

			for(uint j = 1; j < idx; j++)
			{
				printf("%u ", heap[j]);
			}			
			printf("\n");
		}

		fclose(in);
		fclose(out);
	}
	else
	{
		printf("file error\n");
	}

	return 0;
}

void heapify()
{
	int i = idx / 2;
	for(; i > 0; i--)
	{
		sift(i);
	}
}

void cut(uint kpos)
{
	heap[kpos] = heap[idx - 1];
	idx--;
	if(kpos > 1 && heap[kpos] < heap[father(kpos)])
	{
		percolate(kpos);
	}
	else
	{
		sift(kpos);
	}
}

uint add(uint data)
{
	heap[idx++] = data;
	return percolate(idx - 1);
}

void sift(uint kpos)
{
	int son;
	do
	{
		son = 0;
		if(left(kpos) < idx)
		{
			son = left(kpos);
			if(right(kpos) < idx)
			{
				if(heap[left(kpos)] > heap[right(kpos)])
				{
					son = right(kpos);
				}
			}
			if(heap[son] >= heap[kpos])
			{
				son = 0;
			}
		}
		if(son)
		{
			uint temp = heap[son];
			heap[son] = heap[kpos];
			heap[kpos] = temp;
			kpos = son;
		}
	}while(son);
}

uint percolate(uint kpos)
{
	uint key = heap[kpos];
	while(kpos > 1 && key < heap[father(kpos)])
	{
		heap[kpos] = heap[father(kpos)];
		kpos = father(kpos);
	}
	heap[kpos] = key;
	return kpos;
}