Cod sursa(job #2809642)

Utilizator YusyBossFares Yusuf YusyBoss Data 27 noiembrie 2021 12:09:41
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#define  NMAX 200000

using namespace  std;

ifstream cin ("heapuri.in");
ofstream cout ("heapuri.out");

int nheap;
int vheap[NMAX + 1], vpoz1[NMAX + 1], vpoz2[NMAX + 1];
/// vpoz1[node] = al catelea element din sirul de adaugari este elementul din nodul node
/// vpoz2[i] =  in ce nod se afla al i-lea element din sirul de adaugari

static inline int GetMinNode(int node) { /// returneaza nodeul minimului dintre nodul curent si cei doi copii
	int min, pozmin;

	min = vheap[node];
	pozmin = node;

	if (node * 2 < nheap && vheap[node * 2] < min)
		min = vheap[node * 2], pozmin = node * 2;
	if (node * 2 + 1 < nheap && vheap[node * 2 + 1] < min)
		min = vheap[node * 2 + 1], pozmin = node * 2 + 1;

	return pozmin;
}

static inline void myswap (int& a, int &b) {
	int aux;
	aux = a;
	a = b;
	b = aux;
}

void add(int node, int val, int poz) {
	vheap[node] = val;
	vpoz1[node] = poz;
	while (vheap[node] < vheap[node / 2]) {
		myswap(vheap[node], vheap[node / 2]);
		myswap(vpoz1[node], vpoz1[node / 2]);
		vpoz2[vpoz1[node]] = node;

		vpoz1[node / 2] = poz;
		vpoz2[poz] = node / 2;
		node /= 2;
	}

}

void erase(int node) {
	int nodemin;
	myswap(vheap[node], vheap[nheap - 1]);
	vpoz1[node] = vpoz1[nheap - 1];
	nheap--;

	nodemin = GetMinNode(node);
	while (nodemin != node) {
		myswap(vheap[node], vheap[nodemin]);
		myswap(vpoz1[node], vpoz1[nodemin]);
		vpoz2[vpoz1[node]] = nodemin; vpoz2[vpoz1[nodemin]] = node;

		node = nodemin;
		nodemin = GetMinNode(node);
	}
}

int main() {
	int q, op, val, nadd;

	cin >> q;
	nadd = 0;
	nheap = 1;
	while (q--) {
		cin >> op;

		if (op == 1) {
			cin >> val;
			add(nheap++, val, nadd++);
		}
		else if (op == 2) {
			cin >> val;
			erase(vpoz2[val - 1]);
		}
		else
			cout << vheap[1] << "\n";
	}
	return 0;
}