Pagini recente » Cod sursa (job #2106351) | Cod sursa (job #2254614) | Cod sursa (job #2496004) | Cod sursa (job #3132892) | Cod sursa (job #2284925)
#include <bits/stdc++.h>
using namespace std;
namespace Pheap {
vector <int> val = { 0 }, next = { 0 }, fiu = { 0 };
int add(int x) {
val.push_back(x);
next.push_back(0);
fiu.push_back(0);
return val.size() - 1;
}
int join(int a, int b)
{
if (a == 0)
return b;
if (b == 0)
return a;
if (val[a] > val[b]) {
next[b] = fiu[a];
fiu[a] = b;
return a;
}
next[a] = fiu[b];
fiu[b] = a;
return b;
}
int rem_min(int a)
{
int ans = 0, act = 0;
for (int i = fiu[a]; i; ) {
int x = i;
i = next[i];
next[x] = 0;
if (act) {
ans = join(ans, join(act, x));
act = 0;
}
else
act = x;
}
return join(ans, act);
}
}
int main()
{
FILE *in = fopen("algsort.in", "r");
FILE *out = fopen("algsort.out", "w");
int n, x;
fscanf(in, "%d", &n);
int act = 0;
while (n--) {
fscanf(in, "%d", &x);
act = Pheap::join(act, Pheap::add(-x));
}
while (act) {
fprintf(out, "%d ", -Pheap::val[act]);
act = Pheap::rem_min(act);
}
return 0;
}