Pagini recente » Cod sursa (job #1317508) | Cod sursa (job #142393) | Cod sursa (job #3173714) | Cod sursa (job #2053020) | Cod sursa (job #2105996)
//SORTARE CU ARBORI DE INTERVALE
#include<cstdio>
using namespace std;
int a[1000001], i, n, x, y;
inline int min(int a, int b){if (a<=b) return a; else return b;}
inline void update(int poz){
while (poz>1) {
poz/=2;
a[poz]=min(a[2*poz], a[2*poz+1]);
}
}
inline void place(int poz, int val){
int st=1, dr=n, poz_real=1, mij;
while (st<dr) {
mij=st+(dr-st)/2;
if (poz<=mij) {dr=mij; poz_real=poz_real*2;}
else {st=mij+1; poz_real=poz_real*2+1;}
}
a[poz_real]=val;
update(poz_real);
}
/*void get_max(int st, int dr, int poz_real){
int mij=st+(dr-st)/2;
if ((x<=st)&&(dr<=y)) {if (a[poz_real]>sol) sol=a[poz_real]; return;}
if (x<=mij) get_max(st, mij, poz_real*2);
if (mij<y) get_max(mij+1, dr, poz_real*2+1);
}*/
void replaceMax(){
int st=1, dr=n, mij, poz_real=1;
while (st<dr) {
mij=st+(dr-st)/2;
if (a[2*poz_real]==a[1]) {dr=mij; poz_real=poz_real*2;}
else {st=mij+1; poz_real=poz_real*2+1;}
}
a[poz_real]=999999999;
update(poz_real);
}
int main(){
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d", &n);
if (n==1) {scanf("%d", &n); printf("%d\n", n); return 0;}
for (i=1;i<=n;i++) {scanf("%d", &x); place(i, x);}
for (i=1;i<=n;i++) {
printf("%d ", a[1]); ///aka maximul
replaceMax();
}
return 0;
}