Pagini recente » Rating Cristian Marius-Florin (mariusno1) | Cod sursa (job #1001011) | Cod sursa (job #419797) | Cod sursa (job #1471126) | Cod sursa (job #1837996)
#include <iostream>
#include <cmath>
#define INT_MAX 1000000
using namespace std;
int A[500000];
int B[500000];
int N;
void calcMin(){
int lung_bloc = sqrt(N);
int nr_bloc = N/lung_bloc;
int j = 0;
int minim = 0;
for(int i=0; i<nr_bloc; i++){
minim = A[j];
for(int k=0; k<lung_bloc; k++){
minim = min(minim, A[j]);
j++;
}
B[i] = minim;
}
}
int query(int st, int dr){
int lung_bloc = sqrt(N);
int nr_bloc = N/lung_bloc;
int st_bloc = st/lung_bloc;
int dr_bloc = dr/lung_bloc;
int minim = A[st];
while((st % lung_bloc)!=0 && (st <= dr)){
minim = min(minim, A[st]);
st++;
}
while(((dr+1)%lung_bloc!=0) && (dr > st)){
minim = min(minim, A[dr]);
dr--;
}
if((dr - st) > lung_bloc )
for(int i=st_bloc; i<=dr_bloc; i++)
minim = min(minim, B[i]);
return minim;
}
void update_bloc(int i, int minim){
int lung_bloc = N/sqrt(N);
int j=i* lung_bloc;
for(int k=0; k<lung_bloc; k++){
if(A[j] == minim){
A[j] = INT_MAX;
break;
}
j++;
}
j=i* lung_bloc;
minim = A[j];
for(int k=0; k<lung_bloc; k++){
minim = min(minim, A[j]);
j++;
}
B[i] = minim;
}
void sort_batog(){
bool flag = 0;
if((int)sqrt(N) * sqrt(N) < N)
flag = 1;
for(int j=0; j<N; j++){
int minim = B[0];
int pos_min = 0;
for(int i=0; i<N/(int)sqrt(N); i++){
if(B[i] < minim){
minim = B[i];
pos_min = i;
}
}
if(flag && A[N-1] < minim){
minim = A[N-1];
A[N-1] = INT_MAX;
}
else{
B[pos_min] = INT_MAX;
//cout << "B[" << pos_min << "] " << B[pos_min] << " ";
update_bloc(pos_min, minim);
}
printf("%d ", minim);
}
}
int main()
{
freopen("algsort.in","r", stdin);
freopen("algsort.out","w", stdout);
scanf("%d", &N);
for(int i=0; i<N; i++)
scanf("%d", &A[i]);
calcMin();
/*for(int i=0; i<N/(int)sqrt(N); i++)
cout << B[i] << " ";
*/
sort_batog();
return 0;
}