// Partition
#include <stdio.h>
#include <stdlib.h>

int Partition(int*, int, int);

int main(){
  int i, n, *A, std;

  // 配列Aの入力
  scanf("%d", &n);

  A = malloc(sizeof(int) * n + 1);
  
  for(i=0; i < n; i++){
    scanf("%d", &A[i]);
  }

  std = Partition(A, 0, n-1); // パーティションを実施

  // 結果を出力
  for(i=0; i < n; i++){
    if(i != 0)printf(" ");
    if(i == std)printf("[%d]", A[i]);
    else printf("%d", A[i]);
  }
  printf("\n");
  
  return 0;
}

int Partition(int *A, int p, int r){
  int i, j, swap;

  // 配列の要素0からiまでは基準A[r]より小さい値、
  // 要素i+1からr-1までは基準A[r]より大きい値を格納していく
  i = p-1;
  for(j=p; j < r; j++){
    if(A[j] <= A[r]){
      i++;
      swap=A[i];  A[i]=A[j];  A[j]=swap; // A[i]とA[j]を交換
    }
  }
  swap=A[i+1];  A[i+1]=A[r];  A[r]=swap; // 最後にA[i+1]A[r]を交換
  return i+1; // パーティションの基準となる要素を返す
}

