#include<fstream>
using namespace std;
ifstream cin("algsort.in");
ofstream cout("algsort.out");
int n,v[500005];
struct Interval{
int value;
int index;
} Empty={(1LL<<31)-1,0},Min[(2>>20)+1];
Interval SegmentTree(int node,int left,int right){
if(left==right){
Min[node].value=v[left];
Min[node].index=left;
return Min[node];
}
int middle=(left+right)/2;
Interval LeftSubTree=SegmentTree(2*node,left,middle);
Interval RightSubTree=SegmentTree(2*node+1,middle+1,right);
if(LeftSubTree.value<=RightSubTree.value)
Min[node]=LeftSubTree;
else
Min[node]=RightSubTree;
return Min[node];
}
Interval Query(int node,int left,int right,int x,int y){
if(x<=left && right<=y)
return Min[node];
if(x>right || y<left)
return Empty;
int middle=(left+right)/2;
Interval LeftSubTree=Query(2*node,left,middle,x,y);
Interval RightSubTree=Query(2*node+1,middle+1,right,x,y);
if(LeftSubTree.value<=RightSubTree.value)
return LeftSubTree;
else
return RightSubTree;
}
Interval Update(int node,int left,int right,int index,int newvalue){
if(left<=index && index<=right){
if(left==right){
Min[node].value=newvalue;
return Min[node];
}
int middle=(left+right)/2;
Interval LeftSubTree=Update(2*node,left,middle,index,newvalue);
Interval RightSubTree=Update(2*node+1,middle+1,right,index,newvalue);
if(LeftSubTree.value<=RightSubTree.value)
Min[node]=LeftSubTree;
else
Min[node]=RightSubTree;
return Min[node];
}
return Min[node];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
SegmentTree(1,1,n);
for(int i=1;i<n;i++){
Interval position=Query(1,1,n,i,n);
Update(1,1,n,i,position.value);
Update(1,1,n,position.index,v[i]);
swap(v[i],v[position.index]);
}
for(int i=1;i<=n;i++)
cout<<v[i]<<' ';
}