Pagini recente » Statistici Pedro Sanchez (pedrosanchez) | Istoria paginii agm2016/clasament | Istoria paginii utilizator/ptudorsergiu | Istoria paginii utilizator/notpennysboat | Cod sursa (job #2734414)
#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;
}