Pagini recente » Cod sursa (job #1472833) | Cod sursa (job #1204672) | Cod sursa (job #2733157) | Cod sursa (job #714565) | Cod sursa (job #2741693)
#include <fstream>
std::ifstream f("heapuri.in");
std::ofstream g("heapuri.out");
int Ordine[200000], Heap[200000], hp_ultim = -1;
void inserare(int x)
{
Heap[++hp_ultim] = x;
int pozitie_val = hp_ultim;
int parinte = (pozitie_val - 1) / 2;
while(pozitie_val && Heap[parinte] > Heap[pozitie_val])
{
std::swap(Heap[parinte], Heap[pozitie_val]);
pozitie_val = parinte;
parinte = (pozitie_val - 1) / 2;
}
}
void stergere(int ord)
{
int poz = 0;
while(Heap[poz] != Ordine[ord])
++poz;
Heap[poz] = Heap[hp_ultim--];
int fiu_stanga = 2 * poz + 1;
while(fiu_stanga <= hp_ultim)
{
int schimbat = poz;
if(Heap[fiu_stanga] < Heap[schimbat])
schimbat = fiu_stanga;
if(fiu_stanga + 1 <= hp_ultim && Heap[fiu_stanga + 1] < Heap[schimbat])
++schimbat;
if(schimbat != poz)
std::swap(Heap[poz], Heap[schimbat]);
else
break;
poz = schimbat;
fiu_stanga = 2 * poz + 1;
}
}
int main()
{
int N;
f >> N;
for(int Op, x, i = 0; i < N; ++i)
{
f >> Op;
if(Op == 1)
{
f >> x;
Ordine[++Ordine[0]] = x;
inserare(x);
}
else if(Op == 2)
{
f >> x;
stergere(x);
}
else
g << Heap[0] << '\n';
}
return 0;
}