Cod sursa(job #2575295)

Utilizator Iulia25Hosu Iulia Iulia25 Data 6 martie 2020 12:41:52
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;

ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

const int N = 2e5 + 5;

int k, T;
bool f[N];

struct nod	{
	int val, timp; ///valoarea, timpul la care a fost adaugat in heap
} v[N];

void adaug(int x, int timp)	 {
	v[++k].val = x;
	v[k].timp = timp;
	int aux = k;
	while (aux > 1 && v[aux].val < v[aux / 2].val)	{
		swap(v[aux], v[aux / 2]);
		aux /= 2;
	}
}

void sterg(int p)	 {
	v[p] = v[k];
	v[k] = {0, 0};
	--k;
	int aux = p;
	while (aux * 2 <= k && (v[aux].val > v[aux * 2].val || v[aux].val > v[aux * 2 + 1].val))	{
		if (v[aux * 2].val > v[aux * 2 + 1].val && aux * 2 + 1 <= k)	{
			swap(v[aux], v[aux * 2 + 1]);
			aux = aux * 2 + 1;
		} else if (v[aux * 2].val < v[aux].val)	{
			swap(v[aux], v[aux * 2]);
			aux = aux * 2;
		} else
			break;
	}
}

int main()	{
	int n, tip, x;
	fin >> n;
	for (int i = 1; i <= n; ++i)	{
		fin >> tip;
		switch(tip)	 {
		case 1 :
			fin >> x;
			adaug(x, ++T);
			break;
		case 2 :
			fin >> x;
			f[x] = true;
			break;
		case 3 :
			while (f[v[1].timp])
				sterg(1);
			fout << v[1].val << '\n';
			break;
		}
	}
	return 0;
}