Pagini recente » Cod sursa (job #2298914) | Cod sursa (job #1878274) | Cod sursa (job #2074084) | Cod sursa (job #1555943) | Cod sursa (job #2284927)
#include <bits/stdc++.h>
using namespace std;
namespace Pheap {
int val[1000010], next[1000010], fiu[1000010];
int cnt = 0;
inline int add(int x) {
val[++cnt] = x;
return cnt;
}
inline 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;
}
inline 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;
}