Cod sursa(job #2296283)

Utilizator livliviLivia Magureanu livlivi Data 4 decembrie 2018 16:33:27
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include<fstream>
#include<vector>
#define N 200000
using namespace std;

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

vector<bool> erased;

class Heap{
public:
	int value;
	int id;

	Heap (int a = 0, int b = 0){
		value = a;
		id = b;
	}

	bool operator < (Heap a){
		return (value < a.value);
	}

	bool isErased(){
		return erased[id];
	}
};

vector<Heap> heap;

void insertHeap(Heap x){
	heap.push_back(x);

	int p = heap.size() - 1;
	while(p > 0){
		if (heap[p] < heap[(p - 1) / 2]){
			swap(heap[p], heap[(p - 1) / 2]);
			p = (p - 1) / 2;
		}
		else break;
	}
}

void popHeap(){
	int x = heap[0].value;

	swap(heap[0], heap.back());
	heap.pop_back();

	int p = 0;
	while(p < heap.size()){
		//cout << p << ' ' << heap[p].value << endl;
		int fiu = p;

		if (p * 2 + 1 < heap.size() && heap[p * 2 + 1] < heap[fiu]){
			fiu = 2 * p + 1;
		}
		if (p * 2 + 2 < heap.size() && heap[p * 2 + 2] < heap[fiu]){
			fiu = p * 2 + 2;
			//cout << 2 * p + 2 << ' ' << heap[2 * p + 2].value << endl;
		}

		//if (x == 12) cout << p << ' ' << fiu << endl;

		if (fiu == p) break;

		swap(heap[p], heap[fiu]);
		p = fiu;
	}
}

void insert(int x){
	while(!heap.empty() && heap[0].isErased()){
		//if (heap[0].value == 12) cout << heap[1].value << ' ' <<heap[2].value << endl;
		popHeap();
	}
	
	//cout << x << ' ' << erased.size() << endl;
	insertHeap(Heap(x, erased.size()));
	erased.push_back(false);
}

void erase(int x){
	erased[x] = true;

	while(!heap.empty() && heap[0].isErased()){
		//if (heap[0].value == 12) cout << heap[1].value << ' ' <<heap[2].value << endl;
		popHeap();
	}
}

int query(){
	while(!heap.empty() && heap[0].isErased()){
		//if (heap[0].value == 12) cout << heap[1].value << ' ' <<heap[2].value << endl;
		popHeap();
	}

	if (!heap.empty()) return heap[0].value;
	else return -1;
}

int main(){
	int n;
	cin >> n;

	for(int i = 1; i <= n; i++){
		int op;
		cin >> op;

		if (op == 3) cout << query() << endl;
		else {
			int x;
			cin >> x;

			if (op == 1) insert(x);
			if (op == 2) erase(x - 1);
		}
	}

	return 0;
}