Cod sursa(job #1053996)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 13 decembrie 2013 09:33:17
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<fstream>
#define dim 500007
using namespace std;
  
ifstream f("algsort.in");
ofstream g("algsort.out");
int pos[dim],h[dim],N,i,a[dim],n;
inline int rs(int nod){
    return 2*nod+1;
}
inline int ls(int nod){
    return 2*nod;
}
void urca(int k){
  
    while( k>1 && a[h[k>>1]]>a[h[k]]){
        swap(pos[h[k]],pos[h[k>>1]]);
        swap(h[k],h[k>>1]);
        k>>=1;
    }
}
void coboara( int nod){
  
    int fiu=nod;
int rss=rs(nod);
int lss=ls(nod);
  
  
    if(lss<=N && a[h[fiu]]>a[h[lss]] ){
        fiu=lss;
  
    }
    if(rss<=N && a[h[fiu]]>a[h[rss]]){
        fiu=rss;
    }
    if(nod!=fiu){
        swap(pos[h[nod]],pos[h[fiu]]);
        swap(h[fiu],h[nod]);
        coboara(fiu);
    }
}
void insert(    int X   ){
    h[++N]=X;
    pos[X]=N;
    urca(pos[X]);
}
  
void erase( int X ){
    swap(pos[h[X]],pos[h[N]]);
    swap(h[X],h[N]);
    --N;
    coboara(X);
}
int main () {
  
    f>>n;
  
    for(i=1;i<=n;++i){
        f>>a[i];
		insert(i);
    }
	g<<a[h[1]]<<" ";
	for(i=2;i<=n;++i){
		erase(1);
		g<<a[h[1]]<<" ";
	}
    return 0;
}