Pagini recente » Cod sursa (job #1181776) | Monitorul de evaluare | Cod sursa (job #1716614) | Cod sursa (job #363046) | Cod sursa (job #1293366)
#include <fstream>
using namespace std;
/*
arbore binar "compact" = arb bin cu toate nivelele complete, mai putin ultimul,
care contine primele k
poate fi retinut intr-un vector: rad pe poz 1; fiii lui i pe poz 2*i si 2*i+1 => tatal lui i este pe i/2
are inaltimea [logn]
heap = arb bin comp cu propr. ca fiecare nod retine o informatie mai buna decat cele ale fiilor => cea mai buna inf se afla in rad
adaugare: pun elementul nou pe ultima poz, apoi urc in heap cat timp e cazul
setrgere: interschimb elementul pe care vreau sa-l sterg cu ultimul, sterg pe ultimul si apoi urc sau cobor in heap
gasirea optimului -> consult radacina
*/
const int N = 200000;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int h[N], v[N], poz[N], nrh, nre;
//poz[h[i]] = i (pozitia din h pe care se afla AL i-lea citit)
void schimb(int x, int y)
{
int aux = h[x];
h[x] = h[y];
h[y] = aux;
poz[h[x]] = x;
poz[h[y]] = y;
}
void urca(int p)
{
while(p > 1 && v[h[p]] < v[h[p/2]])
{
schimb(p, p/2);
p /= 2;
}
}
void coboara(int p)
{
int fs = 2*p, fd = 2*p + 1, bun = p;
if (fs <= nrh && v[h[fs]] < v[h[bun]]) bun = fs;
if (fd <= nrh && v[h[fd]] < v[h[bun]]) bun = fd;
if (bun != p)
{
schimb(p, bun);
coboara(bun);
}
}
void afisare()
{
for(int i=1;i<=nrh;i++)
g<<v[h[i]]<<" ";
g << "\n";
}
int main()
{
int n, op,x;
f>>n;
for(int i=1; i<=n; i++)
{
f>>op;
if(op == 1)
{
f>>x;
v[++nre] = x;
h[++nrh] = nre;
poz[h[nrh]] = nrh;
urca(nrh);
}
else if(op == 2)
{
f>>x;
x = poz[x];
schimb(x, nrh--);
urca(x);
coboara(x);
}
else g<<v[h[1]]<<'\n';
//afisare();
}
return 0;
}