module module_sort
   implicit none

contains

   recursive subroutine mergesort(a, begin, end, b)
      implicit none
      integer :: a(:), b(:)
      integer, intent(in) :: begin, end ! 配列インデックスの始点、終点
      integer :: mid ! 配列中央のインデックス

      ! 再帰終了条件: begin==end のときは何もせずにreturnする
      if (begin<end) then
         mid = (begin+end)/2
         call mergesort(a,begin,mid,b)
         call mergesort(a,mid+1,end,b)
         call merge_(a,begin,mid,end,b)
      end if
      return

   contains
      subroutine merge_(array,begin,mid,end,memo)
         implicit none
         integer:: array(:), memo(:)
         integer, intent(in) :: begin, mid, end
         integer :: i, j, k, temp

         i = begin   ! 配列前半の頭のインデックス
         j = mid + 1 ! 配列後半の頭のインデックス
         do k = begin, end
            if (j > end) then
               ! 配列後半が入れ終わっている場合
               temp = array(i)
               i = i + 1
            else if (i > mid) then
               ! 配列前半が入れ終わっている場合
               temp = array(j)
               j = j + 1
            else if ( array(i) <= array(j) ) then
               temp = array(i)
               i = i + 1
            else
               temp = array(j)
               j = j + 1
            end if
            memo(k) = temp
         end do

         do i = begin, end
            array(i) = memo(i)
         end do
      end subroutine merge_
   end subroutine mergesort

end module module_sort

program abc134c2
   use module_sort
   implicit none
   integer :: n, i
   integer, allocatable :: a1(:), b1(:)

   read(*,*) n
   allocate(a1(n), b1(n))

   do i = 1, n
      read(*,*) a1(i)
   enddo

   b1 = 0

   call mergesort(a1, 1, n, b1)

   do i = 1, n
      if (a1(i) == b1(n)) then
         write(*,*) b1(n-1)
      else
         write(*,*) b1(n)
      endif
   enddo

end
