/*
TASK:seq
LANG:C
*/

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

typedef struct
{
  long v, i;
} elem;

long n, r1=0, r2=0, last1[2], last2[2];
elem s[1000000];

void input(void)
{
  long i;
  scanf("%ld", &n);
  for(i=0; i<n; ++i)
  {
    scanf("%ld", &s[i].v);
    s[i].i=i;
  }
}

int cmp(const void *a, const void *b)
{
  if(((elem*)a)->v<((elem*)b)->v)
    return -1;
  if(((elem*)a)->v>((elem*)b)->v)
    return 1;
  return 0;
}

void transform(void)
{
  long f=1000000, l=0, i, j;
  qsort(s, n, sizeof(elem), cmp);
  for(j=0, i=0; i<n-1; ++i)
  {
    if(s[i].i<f)
      f=s[i].i;
    if(s[i].i>l)
      l=s[i].i;
    if(s[i].v!=s[i+1].v)
    {
      s[j].i=f;
      s[j].v=l;
      f=1000000;
      l=0;
      ++j;
    }
  }
  n=j;
}

int main(void)
{
  long i;
  input();
  transform();
  last1[0]=last2[1]=s[0].i;
  last2[0]=last1[1]=s[0].v;
  for(i=1; i<n; ++i)
  {
    if(s[i].i<s[i].v)
    {
      if(last1[1]<s[i].i&&last1[1]<last1[0] || last1[1]>s[i].i&&last1[1]>last1[0])
        ++r1;
      if(last1[1]>s[i].i)
        ++r1;
      if(last2[1]<s[i].v&&last2[1]<last2[0] || last2[1]>s[i].v&&last2[1]>last2[0])
        ++r2;
      if(last2[1]<s[i].v)
        ++r2;
      last1[0]=last2[1]=s[i].i;
      last1[1]=last2[0]=s[i].v;
    }
    else
    {
      if(last1[1]<s[i].i&&last1[1]<last1[0] || last1[1]>s[i].i&&last1[1]>last1[0])
        ++r1;
      if(last2[1]<s[i].i&&last2[1]<last2[0] || last2[1]>s[i].i&&last2[1]>last2[0])
        ++r2;
      last1[0]=last1[1];
      last1[1]=s[i].i;
      last2[0]=last2[1];
      last2[1]=s[i].i;
    }
  }
  printf("%ld\n", r1<r2?r1:r2);
  return 0;
}

