Cod sursa(job #2416554)

Utilizator carriedawayIoana Dragos carriedaway Data 27 aprilie 2019 18:24:33
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int A[200000];
int heap[200000];
int dimVec;
int L;
void min_heap(int i)
{
	int smallest = i;
	int l = 2 * i + 1;
	int r = 2 * i + 2;
	if (l < dimVec && A[heap[l]] < A[heap[smallest]])
	{
		smallest = l;
	}
	if (r < dimVec && A[heap[r]] < A[heap[smallest]])
	{
		smallest = r;
	}
	if (smallest != i)
	{
		int aux = heap[i];
		heap[i] = heap[smallest];
		heap[smallest] = aux;
		min_heap(smallest);
	}
}
void min_heap_insert(int* A,int *heap,int i)
{
	while (i / 2 >= 0 && A[heap[i]] < A[heap[i / 2]])
	{
		int aux = heap[i / 2];
		heap[i / 2] = heap[i];
		heap[i] = aux;
		i /= 2;
	}
}
void min_heap_extract(int* A, int* heap, int i)
{
	while (i < dimVec-1)
	{
		int aux = heap[i];
		heap[i] = heap[i+1];
		heap[i+1] = aux;
		i++;
	}
	dimVec--;
}
int main()
{
	int nr_op;
	FILE* fin = fopen("heapuri.in", "r");
	FILE* fout = fopen("heapuri.out", "w");
	fscanf(fin,"%d", &nr_op);
	for (int i = 0; i < nr_op; i++)
	{
		int operatie, numar;
		fscanf(fin, "%d", &operatie);
		if (operatie == 1)
		{
			fscanf(fin, "%d", &numar);
			A[dimVec] = numar;
			heap[L] = dimVec;
			min_heap_insert(A,heap,dimVec);
			dimVec++;
			L++;

		}
		if (operatie == 2)
		{
			fscanf(fin, "%d", &numar);
			int pozitie = -1;
			for (int i = 0; i < dimVec; i++)
			{
				if (heap[i] == numar-1)
				{
					pozitie = i;
					break;
				}
			}
			min_heap_extract(A, heap, pozitie);
			min_heap(0);
		}
		if (operatie == 3)
		{
			fprintf(fout, "%d\n", A[heap[0]]);
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}