Cod sursa(job #828922)

Utilizator matei_cChristescu Matei matei_c Data 4 decembrie 2012 17:35:46
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

#define maxn ( 1 << 20 )
#define inf 2147483647

int n ;
int v[maxn] ;
int arbore[maxn] ;
int nrarb ;

void solve(int nod, int stn, int drn)
{
	if( stn == drn )
		{arbore[nod] = stn;return;}
	solve( nod * 2, stn, (stn + drn)/2);
	solve( nod * 2 + 1, (stn + drn)/2 + 1, drn);
	
	arbore[nod] = arbore[ nod * 2];
	if( v[arbore[ nod * 2 + 1]] < v[arbore[nod]])
		arbore[nod] = arbore[nod*2+1];
	
}

void modifica(int value, int poz, int nod, int st, int dr)
{	
	if( poz > dr || poz < st) return ;
	
	if( st == dr) {
		arbore[nod] = value;
		return ;
	}
	modifica( value, poz, nod * 2, st, ( dr + st ) / 2 ) ;
	modifica( value, poz, nod * 2 + 1, ( st + dr ) / 2 + 1, dr ) ;
	
	if( v[arbore[nod*2]] < v[arbore[nod*2+1]] )
		arbore[nod] = arbore[nod*2] ;
	else
		arbore[nod] = arbore[nod*2+1] ;
	
}

int main()
{
	
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);
	
	scanf("%d", &n);
	
	for(int i = 1; i <= n; ++i )
	{
		scanf("%d", &v[i]);
		
	}
	solve(1,1,n);
	v[0] = inf;
	
	for(int i = 1; i <= n; ++i )
	{
		printf("%d ", v[ arbore[1] ] );
		modifica( 0, arbore[1], 1, 1, n ) ;
	}
	
	return 0;
	
}