Pagini recente » Cod sursa (job #1981235) | Cod sursa (job #382730) | Cod sursa (job #426587) | Cod sursa (job #2641378) | Cod sursa (job #2791984)
#include <iostream>
#include <fstream>
#define NMAX 200001
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int N, x, op;
int dim, contor;
int heap[2*NMAX], pozInHeap[NMAX], value[NMAX];
void interschimba(int i, int j){
int aux;
aux = heap[i], heap[i] = heap[j], heap[j] = aux;
pozInHeap[heap[i]] = i;
pozInHeap[heap[j]] = j;
}
void heapifyUp(int i){
while (i > 1 && value[heap[i]] < value[heap[i/2]]){
interschimba(i, i/2);
i /= 2;
}
}
void push(int val){
heap[++dim] = contor;
pozInHeap[contor] = dim;
heapifyUp(dim);
}
void heapifyDown(int i){
int left = 2*i, right = 2*i + 1, maxIndex = i;
if (left <= dim && value[heap[left]] < value[heap[maxIndex]]) maxIndex = left;
if (right <= dim && value[heap[right]] < value[heap[maxIndex]]) maxIndex = right;
if (maxIndex != i){
interschimba(i, maxIndex);
heapifyDown(maxIndex);
}
}
void removeIndex(int i){
if (i == dim) dim--;
else {
heap[i] = heap[dim--];
pozInHeap[heap[i]] = i;
heapifyUp(i);
heapifyDown(i);
}
}
int main()
{
fin >> N;
for (int i = 0; i < N; ++i) {
fin >> op;
if (op == 1){
fin >> x;
value[++contor] = x;
push(contor);
}
else if (op == 2){
fin >> x;
removeIndex(pozInHeap[x]);
}
else
fout << value[heap[1]] << '\n';
}
fin.close();
fout.close();
return 0;
}