//如果每次循环都用一次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();
    }
}