Pagini recente » Cod sursa (job #2138819) | Cod sursa (job #1053145) | Cod sursa (job #2151025) | Cod sursa (job #3191719) | Cod sursa (job #2742374)
#include <fstream>
std::ifstream f("heapuri.in");
std::ofstream g("heapuri.out");
int Numar_ins[200005], Heap[200005], Poz_in_Heap[200005], hp_ultim = -1;
void inserare(int x)
{
Numar_ins[ ++Numar_ins[0] ] = x;
Heap[++hp_ultim] = Numar_ins[0];
Poz_in_Heap[ Numar_ins[0] ] = hp_ultim;
int pozitie_val = hp_ultim;
int parinte = (pozitie_val - 1) / 2;
while(pozitie_val && Numar_ins[ Heap[parinte] ] > Numar_ins[ Heap[pozitie_val] ])
{
std::swap(Heap[parinte], Heap[pozitie_val]);
std::swap(Poz_in_Heap[ Heap[parinte] ], Poz_in_Heap[ Heap[pozitie_val] ]);
pozitie_val = parinte;
parinte = (pozitie_val - 1) / 2;
}
}
void stergere(int ord)
{
int poz = Poz_in_Heap[ord];
Heap[poz] = Heap[hp_ultim--];
Poz_in_Heap[ Heap[poz] ] = poz;
int de_schimbat = poz;
int fiu_stanga = 2 * poz + 1;
int fiu_dreapta = fiu_stanga + 1;
while(fiu_stanga <= hp_ultim)
{
if(Numar_ins[ Heap[fiu_stanga] ] < Numar_ins[ Heap[de_schimbat] ])
de_schimbat = fiu_stanga;
if(fiu_dreapta <= hp_ultim && Numar_ins[ Heap[fiu_dreapta] ] < Numar_ins[ Heap[de_schimbat] ])
de_schimbat = fiu_dreapta;
if(de_schimbat != poz)
{
std::swap(Heap[poz], Heap[de_schimbat]);
std::swap(Poz_in_Heap[ Heap[poz] ], Poz_in_Heap[ Heap[de_schimbat] ]);
}
else
break;
poz = de_schimbat;
fiu_stanga = 2 * poz + 1;
fiu_dreapta = fiu_stanga + 1;
}
}
int main()
{
int N;
f >> N;
for(int Op, x, i = 0; i < N; ++i)
{
f >> Op;
if(Op == 1)
{
f >> x;
inserare(x);
}
else if(Op == 2)
{
f >> x;
stergere(x);
}
else
g << Numar_ins[ Heap[0] ] << '\n';
}
return 0;
}