Pagini recente » Cod sursa (job #1094704) | Cod sursa (job #290994) | Cod sursa (job #825562) | Cod sursa (job #1804682) | Cod sursa (job #2784637)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, elemente, nrElementeHeap;
int heap[200001], pozHeap[200001], vecInitial[200001];
void heapDown(int p) {
if (p == nrElementeHeap) {
nrElementeHeap--;
return;
}
heap[p] = heap[nrElementeHeap--];
pozHeap[heap[p]] = p;
while (p / 2 > 0 && vecInitial[heap[p]] < vecInitial[heap[p / 2]]) {
{
swap(heap[p], heap[p / 2]);
vecInitial[heap[p]] = p;
vecInitial[heap[p / 2]] = p / 2;
p = p / 2;
}
}
while (2 * p <= nrElementeHeap) {
int st = 2 * p, dr = 2 * p + 1, crt = p;
if (vecInitial[heap[st]] < vecInitial[heap[crt]])
crt = st;
if (dr <= nrElementeHeap && vecInitial[heap[dr]] < vecInitial[heap[crt]])
crt = dr;
if (crt != p) {
swap(heap[p], heap[crt]);
pozHeap[heap[crt]] = crt;
pozHeap[heap[p]] = p;
p = crt;
}
else
break;
}
}
int heapUp(int pozitie)
{
int t = pozitie;
while (t / 2 >= 0 && vecInitial[heap[t / 2]] > vecInitial[heap[t]])
{
//fac interschimbarea in heap
swap(heap[t / 2], heap[t]);
pozHeap[heap[t / 2]] = t / 2;
pozHeap[heap[t]] = t;
t /= 2;
}
return t;
}
void eliminHeap(int pozitie)
{
if (pozitie == nrElementeHeap)
{
nrElementeHeap--;
return;
}
heap[pozitie] = heap[nrElementeHeap--];
heapUp(pozitie);
heapDown(pozitie);
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
{
int op, x;
fin >> op;
if (op == 1)
{
fin >> x;
vecInitial[++elemente] = x;
heap[++nrElementeHeap] = elemente;
pozHeap[elemente] = nrElementeHeap;
//fac urcare
heapUp(nrElementeHeap);
}
else if (op == 3)
{
fout << vecInitial[heap[1]] << "\n";
}
else
{
fin >> x;
eliminHeap(pozHeap[x]);
}
}
/*for (int i = 1; i <= nrElementeHeap; i++)
{
fout<<heap[i]<<" ";
}
fout<<"\n";
for(int i=1; i<=nrElementeHeap; i++)
{
fout<<vecInitial[heap[i]]<<" ";
}*/
return 0;
}