Pagini recente » Cod sursa (job #2947510) | Cod sursa (job #152176) | Cod sursa (job #675474) | Cod sursa (job #479241) | Cod sursa (job #1571688)
#include <fstream>
using namespace std;
const int Nmax = 200001;
int nr_q;
int tip;
int numar;
int val[Nmax];
int heap[Nmax];
int poz[Nmax];
int nre, nrh;
int tb_sters;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
inline int tata(int nod) { return nod / 2; }
inline int fiu_stanga(int nod) { return nod * 2; }
inline int fiu_dreapta(int nod) { return nod * 2 + 1; }
void schimba(int nod1, int nod2)
{
int aux;
aux = heap[nod1];
heap[nod1] = heap[nod2];
heap[nod2] = aux;
poz[ heap[nod1] ] = nod1;
poz[ heap[nod2] ] = nod2;
}
void urca(int nod)
{
while(val[ heap[tata(nod)] ] > val[ heap[nod] ] && nod > 1)
{
schimba(tata(nod), nod);
nod = tata(nod);
}
}
void coboara(int nod)
{
int ales = nod;
if(fiu_stanga(nod) <= nrh && val[ heap[nod] ] > val[ heap[fiu_stanga(nod)] ]) ales = fiu_stanga(nod);
if(fiu_dreapta(nod) <= nrh && val[ heap[nod] ] > val[ heap[fiu_dreapta(nod)] ]) ales = fiu_dreapta(nod);
if(ales != nod)
{
schimba(ales, nod);
coboara(ales);
}
}
int main()
{
f >> nr_q;
for(int i = 1; i <= nr_q; i ++)
{
f >> tip;
if(tip == 1)
{
f >> numar;
val[++ nre] = numar;
heap[++ nrh] = nre;
poz[ heap[nrh] ] = nrh;
urca(nrh);
}
if(tip == 2)
{
f >> numar;
tb_sters = poz[numar];
schimba(tb_sters, nrh --);
coboara(tb_sters);
urca(tb_sters);
}
if(tip == 3) g << val[ heap[1] ] << '\n';
}
return 0;
}