output_description: Print the minimum number of operations required.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N
      P_1
      :
      P_N
attempt: # coding: utf-8
  import re
  import math
  from copy import deepcopy
  import fractions
  import random
  from heapq import heappop, heappush
  import time
  import sys
  
  readline = sys.stdin.readline
  # import numpy as np
  mod = int(10**9 + 7)
  inf = int(10**20)
  
  
  class union_find:
      def __init__(self, n):
          self.n = n
          self.P = [a for a in range(N)]
          self.rank = [0] * n
  
      def find(self, x):
          if x != self.P[x]:
              self.P[x] = self.find(self.P[x])
          return self.P[x]
  
      def same(self, x, y):
          return self.find(x) == self.find(y)
  
      def link(self, x, y):
          if self.rank[x] < self.rank[y]:
              self.P[x] = y
          elif self.rank[y] < self.rank[x]:
              self.P[y] = x
          else:
              self.P[x] = y
              self.rank[y] += 1
  
      def unite(self, x, y):
          self.link(self.find(x), self.find(y))
  
      def size(self):
          S = set()
          for a in range(self.n):
              S.add(self.find(a))
          return len(S)
  
  
  def bin_(num, size):
      A = [0] * size
      for a in range(size):
          if (num >> (size - a - 1)) & 1 == 1:
              A[a] = 1
          else:
              A[a] = 0
      return A
  
  
  def fac_list(n, mod_=0):
      A = [1] * (n + 1)
      for a in range(2, len(A)):
          A[a] = A[a - 1] * a
          if mod > 0:
              A[a] %= mod_
      return A
  
  
  def comb(n, r, mod, fac):
      if n - r < 0:
          return 0
      return (fac[n] * pow(fac[n - r], mod - 2, mod) * pow(fac[r], mod - 2, mod)) % mod
  
  
  def next_comb(num, size):
      x = num & (-num)
      y = num + x
      z = num & (~y)
      z //= x
      z = z >> 1
      num = y | z
      if num >= (1 << size):
          return False
      else:
          return num
  
  
  def get_primes(n, type="number"):
      A = [True] * (n + 1)
      A[0] = False
      A[1] = False
      for a in range(2, n + 1):
          if A[a]:
              for b in range(a * 2, n + 1, a):
                  A[b] = False
      if type == "bool":
          return A
      B = []
      for a in range(n + 1):
          if A[a]:
              B.append(a)
      return B
  
  
  def is_prime(num):
      if num <= 2:
          return False
      i = 2
      while i * i <= num:
          if num % i == 0:
              return False
          i += 1
      return True
  
  
  fac = fac_list(10**5 + 100, mod)
  
  
  def C(n, r):
      if n - r < 0:
          return 0
      return (fac[n] * pow(fac[n - r], mod - 2, mod) * pow(fac[r], mod - 2, mod)) % mod
  
  
  # main
  N = int(input())
  Q = [0] * N
  for a in range(N):
      Q[int(input()) - 1] = a
  
  ans = 1
  K = 1
  for a in range(1, N - 1):
      if Q[a - 1] < Q[a]:
          K += 1
      else:
          K = 1
      ans = max(K, ans)
  ans = N - ans
  print(ans)
  
problem_description: Statement
  
  You are given a sequence (P_1,P_2,...,P_N) which is a permutation of the
  integers from 1 through N. You would like to sort this sequence in ascending
  order by repeating the following operation:
  
    * Choose an element in the sequence and move it to the beginning or the end of the sequence.
  
  Find the minimum number of operations required. It can be proved that it is
  actually possible to sort the sequence using this operation.
samples: [{"input": "4\n    1\n    3\n    2\n    4", "output": "2\n    \n\nFor example, the sequence can be sorted in ascending order as follows:\n\n  * Move 2 to the beginning. The sequence is now (2,1,3,4).\n  * Move 1 to the beginning. The sequence is now (1,2,3,4).\n\n* * *"}, {"input": "6\n    3\n    2\n    5\n    1\n    4\n    6", "output": "4\n    \n\n* * *"}, {"input": "8\n    6\n    3\n    1\n    2\n    7\n    4\n    8\n    5", "output": "5"}]