Pagini recente » Cod sursa (job #1691479) | Cod sursa (job #2116475) | Cod sursa (job #2970060) | Cod sursa (job #1962847) | Cod sursa (job #1815184)
#include <iostream>
#include <fstream>
using namespace std;
ifstream ka("heapuri.in");
ofstream ki("heapuri.out");
const int N_MAX = 200000;
int n, x, c, heap_size;
int val[N_MAX + 1], heap[N_MAX + 1], poz[N_MAX + 1];
void urcare(int t)
{
while(t / 2 && val[heap[t / 2]] > val[heap[t]])
{
swap(poz[heap[t / 2]], poz[heap[t]]);
swap(heap[t / 2], heap[t]);
t /= 2;
}
}
void coborare(int t)
{
if(2 * t <= heap_size)
{
if(val[heap[t]] > val[heap[2 * t]])
{
if(2 * t + 1 <= heap_size && val[heap[2 * t + 1]] < val[heap[2 * t]])
{
swap(poz[heap[t]], poz[heap[2 * t + 1]]);
swap(heap[t], heap[2 * t + 1]);
coborare(2 * t + 1);
}
else
{
swap(poz[heap[t]], poz[heap[2 * t]]);
swap(heap[t], heap[2 * t]);
coborare(2 * t);
}
}
else if(2 * t + 1 <= heap_size && val[heap[2 * t + 1]] < val[heap[t]])
{
swap(poz[heap[t]], poz[heap[2 * t + 1]]);
swap(heap[t], heap[2 * t + 1]);
coborare(2 * t + 1);
}
}
}
int main()
{
ka >> n;
while(n--)
{
ka >> c;
if(c == 1)
{
ka >> x;
val[++poz[0]] = x;
heap_size++;
heap[heap_size] = poz[0];
poz[poz[0]] = heap_size;
urcare(heap_size);
}
else if(c == 2)
{
ka >> x;
poz[heap[heap_size]] = poz[x];
heap[poz[x]] = heap[heap_size];
heap_size--;
coborare(poz[x]);
}
else //if(c == 3)
ki << val[heap[1]] << '\n';
/*for(int i = 1; i <= heap_size; i++)
cout << val[heap[i]] << " ";
cout << '\n';*/
}
}