//如果每次循环都用一次Collections.max(intArr.subList(i,N))的话,
//时间复杂度是N**2,但是,
//如果提前先用反向循环设计一个最大值数组,时间复杂度就是N
//即,intArr数组的最后一位肯定是这个(N,N)里最大的,所以从右往左推,用Math.max判断,maxArr每个切片的最大值
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(System.out);
int N=Integer.parseInt(br.readLine());
ArrayList<Integer> intArr=new ArrayList<>();
String[] arr=br.readLine().split(" ");
int[] maxArr=new int[N];
for(String i:arr){
intArr.add(Integer.parseInt(i));
}
maxArr[N-1]=intArr.get(N-1);
for(int i=N-2;i>=0;i--){
maxArr[i]=Math.max(maxArr[i+1],intArr.get(i));
}
Stack<Integer> sk= new Stack<>();
for(int i=0;i<N;i++){
int A=intArr.get(i);
//原来的:sk.empty()&&A!=Collections.max(intArr.subList(i,N))
if(sk.empty()&&A!=maxArr[i]){
sk.push(A);
}else{
//原来的:int max=Collections.max(intArr.subList(i,N));
int max=maxArr[i];
if(A<max||i==N-1){
sk.push(A);
}else{
if(i!=N-1||sk.empty()){pw.print(A+" ");}
else{pw.print(A);}
}
}
}
while(sk.size()!=1&&sk.size()!=0){
pw.print(sk.pop()+" ");
}
pw.print(sk.pop());
pw.flush();
}
}