Cod sursa(job #2484195)

Utilizator invoIlioi Alexandru invo Data 30 octombrie 2019 19:08:57
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<iostream>
#define MAX 200005
using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int m,q,n,val,a[MAX],c[MAX];

void insertIntoHeap(int val)
{
	a[n++] = val;
	c[n-1] = val;
	int k = n-1;
	while (a[(k - 1) / 2] > a[k])
	{
		swap(a[(k - 1) / 2], a[k]);
		k = (k - 1) / 2;
	}
}

void deleteFromHeap(int val)
{
	int i;
	val = c[val-1];
	for (i = 0; i < n; ++i)
	{
		if (val == a[i])
			break;
	}
	swap(a[i], a[n - 1]);
	a[n - 1] = 0;
	int k = i;
	n--;
	while (a[(k - 1) / 2] > a[k])
	{
		swap(a[(k - 1) / 2], a[k]);
		k = (k - 1) / 2;
	}
	while (((2*k+1 < n) && a[k] > a[2 * k + 1]) || ((2*k+2 < n) && a[k] > a[2*k+2]))
	{
		if (a[k] > a[2 * k + 1])
		{
			swap(a[k], a[2 * k + 1]);
			k = 2 * k + 1;
		}
		else
		{
			swap(a[k], a[2 * k + 2]);
			k = 2 * k + 2;
		}
		if (k > n)
			break;
	}
}
int main()
{
	f >> m;
	for (int i = 0; i < m; ++i)
	{
		f >> q;
		if (q == 1)
		{
			f >> val;
			insertIntoHeap(val);
		}
		else if (q == 2)
		{
			f >> val;
			deleteFromHeap(val);
		}
		else
		{
			g << a[0] << '\n';
		}
	}
}