Pagini recente » Cod sursa (job #160608) | Cod sursa (job #2943055) | Cod sursa (job #2981862) | Cod sursa (job #2084926) | Cod sursa (job #820822)
Cod sursa(job #820822)
#include <fstream>
#include <cassert>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
int h[500010],n,i,j,k;
inline void heap_add(int v) {
h[++h[0]] = v;
// urca in heap
int i = h[0], t;
while(i > 1 && h[i] < h[i/2]) {
t = h[i];
h[i] = h[i/2];
h[i/2] = t;
i /= 2;
}
}
inline int min3(int a, int b, int c) {
return min(a, min(b, c));
}
inline int heap_pop() {
int v = h[1];
h[1] = h[h[0]];
h[0] --;
int i = 1;
i = 1;
// coboara in heap
while(2*i <= h[0]) {
if(2*i+1 > h[0]) {
if(h[i] > h[2*i])
swap(h[i], h[2*i]);
break;
} else {
if(h[i] == min3(h[i], h[2*i], h[2*i+1]))
break;
else if(h[2*i] > h[2*i+1]) {
swap(h[i], h[2*i+1]);
i = 2*i+1;
} else {
swap(h[i], h[2*i]);
i = 2*i;
}
}
}
return v;
}
inline bool heap_check(int i) {
if(2 * i > h[0]) {
return true;
}
if(h[i] > h[2*i]) {
return false;
}
if(2*i+1 <= h[0] && h[i] > h[2*i+1]) {
return false;
}
if(2*i+1 <= h[0]) {
return heap_check(2*i) && heap_check(2*i+1);
} else {
return heap_check(2*i);
}
}
int main() {
in>>n;
for(i=1; i<=n; i++) {
in>>k;
heap_add(k);
}
for(i=1; i<=n; i++) {
out<<heap_pop()<<' ';
//heap_pop();
//for(j=1; j<=h[0]; j++) {
// out<<h[j]<<'\t';
//}
//out<<'\n';
}
}