Cod sursa(job #3137970)

Utilizator Uriesu_IuliusUriesu Iulius Uriesu_Iulius Data 16 iunie 2023 15:08:51
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int mxN = 2e5 + 5;
int H[mxN], v[mxN], n;

void sift(int p) {
	int i = p;
	while (i > 1 && H[i] < H[i / 2]) {
		swap(H[i], H[i / 2]);
		i /= 2;
	}
}

void percolate(int p) {
	int i = p;
	while (true) {
		int minSon = 0;
		if (2 * i <= n) {
			minSon = 2 * i;
		}
		if (2 * i + 1 <= n && H[2 * i + 1] < H[2 * i]) {
			minSon = 2 * i + 1;
		}

		if (minSon == 0 || H[i] < H[minSon]) {
			break;
		}

		swap(H[i], H[minSon]);
		i = minSon;
	}
}

void add(int k) {
	H[++n] = k;
	sift(n);
}

int search(int k) {
	for (int i = 1; i <= n; i++) {
		if (H[i] == k) {
			return i;
		}
	}
}

void remove(int k) {
	int p = search(k);
	H[p] = H[n];
	n--;
	percolate(p);
}

int main() {

	int q;
	fin >> q;
	for (int i = 0; i < q; i++) {
		int ask, x;
		fin >> ask;
		if (ask == 1) {
			fin >> x;
			v[n + 1] = x;
			add(x);
		}
		else if (ask == 2) {
			fin >> x;
			remove(v[x]);
		}
		else {
			fout << H[1] << "\n";
		}
	}

	return 0;
}