Cod sursa(job #2734414)

Utilizator HadircaDionisieHadirca Dionisie HadircaDionisie Data 31 martie 2021 20:31:18
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

#define NMAX 2000010


using namespace std;

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

class minHeap {
	int* heap;
	int currentSize = 0;
	int SIZE;
public:
	minHeap() {
		SIZE = NMAX;
		currentSize = 0;
		heap = new int[SIZE];
	}
	~minHeap() {
		cout << "\n\ndestructor";
		delete[] heap;
	}

	int* getArr() {
		return heap;
	}
	int getCurrentSize() {
		return currentSize;
	}
	int parent(int i){
		return (i - 1) / 2;
	}

	int leftSon(int i) {
		return 2 * i + 1;
	}

	int rightSon(int i) {
		return 2 * i + 2;
	}

	void insert(int x) {
		int i = currentSize;
		heap[i] = x;
		currentSize++;

		while (i != 0 && heap[parent(i)] > heap[i]) {
			swap(heap[i], heap[parent(i)]);
			i = parent(i);
		}
	}

	int findIndex(int num) {
		for (int i = 0; i < currentSize; i++) {
			if (num == heap[i]) {
				return i;
			}
		}
		return 0;
	}
	int getMin() {
		return heap[0];
	}

	void removeElementAtIndex(int i) {
		currentSize -= 1;
		heap[i] = heap[currentSize];
		while (i<currentSize-1) {
			if (heap[i] >= heap[leftSon(i)] && heap[i] >= heap[rightSon(i)]) {
				if (heap[leftSon(i)] <= heap[rightSon(i)]) {
					swap(heap[i], heap[leftSon(i)]);
					i = 2 * i + 1;
				}
				else if(2*i+2<currentSize){
					swap(heap[i], heap[rightSon(i)]);
					i = 2 * i + 2;
				}
				else {
					swap(heap[i], heap[leftSon(i)]);
					i = 2 * i + 1;
				}
			}
		}
	}
};


int main() {

	minHeap arr;
	int j = 1;
	int n;
	fin >> n;

	vector<pair<int,int>> introduse;

	for (int i = 0; i < n; i++) {
		int operatie;
		int numar;

		fin >> operatie;
		if (operatie == 3) {
			numar = arr.getMin();
			fout << numar<<"\n";
		}
		else if (operatie == 2) {
			fin >> numar;
			numar = (int)numar;
			int ceva = 0;
			for (int i = 0; i < introduse.size(); i++) {
				int m = introduse[i].second;
				if (m == numar)
				{
					ceva = introduse[i].first;
					int idx = arr.findIndex(ceva);
					arr.removeElementAtIndex(idx);
					break;
				}
			}
		
		}
		else
		{
			fin >> numar;
			arr.insert(numar);
			introduse.push_back({ numar,j++ });
		}


		
	}
	for (int i = 0; i < introduse.size(); i++) {
		cout << introduse[i].first << ' '<<introduse[i].second;
		cout << endl;
	}
	

	return 0;
}