Pagini recente » Cod sursa (job #1402891) | Cod sursa (job #200921) | Cod sursa (job #2714058) | Cod sursa (job #2776844) | Cod sursa (job #521489)
Cod sursa(job #521489)
#include <fstream>
#include <iostream>
using namespace std;
#define maxn 200010
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n, val[maxn], heap[maxn], poz_heap[maxn], x, m, y;
void push(int nod)
{
int aux;
while(val[heap[nod]] < val[heap[nod / 2]] && nod / 2)
{
aux = heap[nod];
heap[nod] = heap[nod / 2];
heap[nod / 2] = aux;
poz_heap[heap[nod]] = nod;
poz_heap[heap[nod / 2]] = nod / 2;
nod /= 2;
}
}
void inserare()
{
f >> x;
y++;
m++;
val[m] = x;
heap[y] = m;
poz_heap[m] = y;
push(y);
}
void scufunda(int nod)
{
int aux;
while((val[heap[nod]] > val[heap[nod * 2]] || val[heap[nod]] > val[heap[nod * 2 + 1]] ) && nod * 2 <= y)
if(val[heap[nod * 2]] <= val[heap[nod * 2 + 1]])
{
aux = heap[nod];
heap[nod] = heap[nod * 2];
heap[nod * 2] = aux;
poz_heap[heap[nod]] = nod;
poz_heap[heap[nod * 2]] = nod * 2;
nod *= 2;
}
else
{
aux = heap[nod];
heap[nod] = heap[nod * 2 + 1];
heap[nod * 2 + 1] = aux;
poz_heap[heap[nod]] = nod;
poz_heap[heap[nod * 2 + 1]] = nod * 2 + 1;
nod = nod * 2 + 1;
}
}
void sterge()
{
f >> x;
int poz = poz_heap[x];
val[x] = -1;
push(poz);
poz_heap[heap[1]] = 0;
heap[1] = heap[y--];
poz_heap[heap[1]] = 1;
if(y > 1)scufunda(1);
}
int main()
{
f >> n;
for(int i = 1; i <= n; ++i)
{
int cod;
f >> cod;
if(cod == 1) inserare();
if(cod == 2) sterge();
if(cod == 3) g << val[heap[1]] << '\n';
}
f.close();
g.close();
return 0;
}