Pagini recente » Cod sursa (job #1838753) | Cod sursa (job #473677) | Cod sursa (job #1294752) | Cod sursa (job #81696) | Cod sursa (job #2882756)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
const int maxn = 1000005;
int pozitie[maxn];
int heap[maxn];
int cand[maxn];
int n; /// dimensiunea heapului
int nrinserari;
void up(int nod)
{
if(nod == 1)
return;
int tata = nod / 2;
if(heap[nod] < heap[tata])
{
pozitie[cand[nod]] = tata;
pozitie[cand[tata]] = nod;
swap(heap[nod], heap[tata]);
swap(cand[nod], cand[tata]);
up(tata);
}
}
void down(int nod)
{
/// fii sunt nod * 2, nod * 2 + 1
/// trebuie sa ii compar ca sa vad cu cine interschimb
if(nod * 2 > n)
return;
int fiumin = nod * 2;
if(nod * 2 + 1 <= n && heap[fiumin] > heap[nod * 2 + 1])
fiumin = nod * 2 + 1;
if(heap[nod] > heap[fiumin])
{
pozitie[cand[nod]] = fiumin;
pozitie[cand[fiumin]] = nod;
swap(heap[nod], heap[fiumin]);
swap(cand[nod], cand[fiumin]);
down(fiumin);
}
}
void inserare(int val)
{
n++;
heap[n] = val;
cand[n] = nrinserari;
pozitie[nrinserari] = n;
up(n);
}
void stergere(int x)
{
int nod = pozitie[x];
swap(pozitie[cand[nod]], pozitie[cand[n]]);
swap(heap[nod], heap[n]);
swap(cand[nod], cand[n]);
n--;
up(nod);
down(nod);
}
int main()
{
int n,a;
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>a;
nrinserari++;
inserare(a);
}
for(int i=1;i<=n;i++)
{
fout<<heap[1]<<" ";
stergere(cand[1]);
}
/*int m;
in >> m;
for(int i = 1; i <= m; i++)
{
int op, x;
in >> op;
if(op == 1 || op == 2)
in >> x;
if(op == 1)
{
nrinserari++;
inserare(x);
}
else if(op == 2)
stergere(x);
else
out << heap[1] << "\n";
}
return 0;*/
}