Pagini recente » Cod sursa (job #2890159) | Cod sursa (job #1651968) | Cod sursa (job #706419) | Cod sursa (job #3038421) | Cod sursa (job #2238090)
#include <bits/stdc++.h>
using namespace std;
const int MAX = static_cast<const int>(2e5 + 14);
pair <int, int> heap[MAX];
int numberOfNodes;
int fv [MAX];
void downNode (int nod)
{
if (nod * 2 <= numberOfNodes and nod * 2 + 1 <= numberOfNodes)
{
if (heap[nod].first > heap [nod * 2].first and heap [nod].first > heap [nod * 2 + 1].first){
if (heap [nod * 2].first > heap [nod * 2 + 1].first)
{
swap (heap[nod * 2 + 1], heap [nod]);
downNode(nod * 2 + 1);
return;
}
else
{
swap (heap[nod * 2], heap [nod]);
downNode(nod * 2);
return;
}
}
}
if (nod * 2 + 1 <= numberOfNodes and heap [nod * 2 + 1].first < heap [nod].first)
{
swap (heap[nod * 2 + 1], heap [nod]);
downNode(nod * 2 + 1);
return;
}
if (nod * 2 <= numberOfNodes and heap [nod * 2].first < heap [nod].first)
{
swap (heap[nod * 2], heap [nod]);
downNode(nod * 2);
return;
}
}
void delNode (int nod)
{
swap(heap[1], heap [numberOfNodes]);
numberOfNodes -= 1;
downNode (1);
}
void upNode (int nod)
{
if (numberOfNodes / 2 == 0) return;
if (heap[numberOfNodes / 2].first > heap[numberOfNodes].first) {
swap(heap[numberOfNodes / 2], heap[numberOfNodes]);
upNode(nod);
}
}
void insertNode(int val, int &nr)
{
numberOfNodes++;
heap[numberOfNodes] = {val, ++nr};
upNode(numberOfNodes);
}
int main() {
ifstream inputFile("heapuri.in");
ofstream outputFile("heapuri.out");
int n, x, nod, nr, a;
inputFile >> n;
for (int i = 1; i<=n; i++)
{
inputFile >> x;
if (x == 1) {
inputFile >> nod;
insertNode(nod, nr);
}
else if (x == 2){
inputFile >> a;
fv [a] = 1;
}
else {
while(numberOfNodes and fv [heap[1].second])
delNode(1);
outputFile << heap[1].first << '\n';
}
}
return 0;
}