/*
TASK:seq
LANG:C++
*/
#include<cstdio>
#include<algorithm>
#include<vector>
#define MAXN 100000
#define MIN(a,b) (a)>(b) ? (a) : (b)
#define MIN4(a,b,c,d) MIN((MIN(a,b)),(MIN(c,d)))
using namespace std;

int dp[MAXN][8];
int kk[MAXN];
int n;
int min;
int ans;
class group
{
public:
    int begin, end;
    group(){begin=0;end=0;}
    group(int a, int b){begin=a;end=b;}
    group operator = (group p){begin=p.begin;end=p.end;}
};
class pos
{
public:
    int num, position;
    pos(){num=0;position=0;}
    pos(int a, int b){num=a;position=b;}
    bool operator < (const pos p)const{
         if(num!=p.num) return num<p.num;
         else return position<p.position;
    }
};
pos a[MAXN];
group t[MAXN];
vector<int> v;
int brgr=0;
void init()
{
//    freopen("seq.in","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
       scanf("%d",&a[i].num);
       a[i].position=i+1;
    }
}
int calc(int k,int code)
{
    int i;
    int br=0;
    int ll;
    for(i=0;i<k;i++)
    {
        if(t[i].end!=t[i].begin)
        {
            if((code&(1<<k)))
            {
                v.push_back(t[i].begin);
                v.push_back(t[i].end);
                code=code<<1;
            }
            else
            {
                v.push_back(t[i].end);
                v.push_back(t[i].begin);
                code=code>>1;
            }
        }
        else
        {
            v.push_back(t[i].begin);
            code=code>>1;
        }
    }
    if(v.size()>2)
        {
            for(i=1;i<v.size()-1;i++)
                if((v[i]>v[i-1]&&v[i]>v[i+1])||(v[i]<v[i-1]&&v[i]<v[i+1]))br++;
        }
    v.clear();
    return br;
}
void solve()
{
    int i,j;
    int begin, end=0;
    int min;
    sort(a,a+n);
    begin=a[0].position;
    for(i=1;i<n;i++)
        if(a[i].num!=a[i-1].num)
        {
            end=a[i-1].position;
            t[brgr++]=group(begin,end);
            begin=a[i].position;
        }
    end=a[n-1].position;
    t[brgr++]=group(begin,end);
    for(i=0;i<8;i++)
    {
        dp[1][i]=calc(2,i);
    }
    for(i=2;i<brgr;i++)
    {
        if(t[i-1].end-t[i-1].begin!=0)
        {
            //dp[i][0]
            if(t[i-1].begin<t[i].end) dp[i][0]=1;
            dp[i][0]=dp[i][0]+(MIN(MIN(dp[i-2][0],dp[i-2][2]),MIN(dp[i-2][4],dp[i-2][6])));
            //dp[i][1]
            if(t[i-1].begin>t[i].begin&&(t[i].end-t[i].begin!=0))dp[i][1]++;
            if(t[i-1].begin<t[i].end)dp[i][1]++;
            dp[i][1]=dp[i][1]+(MIN(MIN(dp[i-2][0],dp[i-2][2]),MIN(dp[i-2][4],dp[i-2][6])));
            //dp[i][2]
            if(t[i-1].end>t[i].end)dp[i][2]++;
            dp[i][2]=dp[i][2]+(MIN(MIN(dp[i-2][1],dp[i-2][3]),MIN(dp[i-2][5],dp[i-2][7])));
            //dp[i][3];
            if(t[i-1].end>t[i].begin)dp[i][3]++;
            if(t[i-1].end<t[i].begin&&(t[i].end-t[i].begin!=0))dp[i][3]++;
            dp[i][3]=dp[i][3]+(MIN(MIN(dp[i-2][1],dp[i-2][3]),MIN(dp[i-2][5],dp[i-2][7])));
            dp[i][4]=dp[i][0];
            dp[i][5]=dp[i][1];
            dp[i][6]=dp[i][2];
            dp[i][7]=dp[i][3];
        }
        else
        {
            //dp[i][0] dp[i][2]
            if((t[i-2].begin<t[i-1].begin)&&(t[i].end<t[i-1].begin))dp[i][0]++;
            if((t[i-2].begin>t[i-1].begin)&&(t[i].end>t[i-1].begin))dp[i][0]++;
            if(t[i-1].begin<t[i].end&&t[i].end-t[i].begin!=0) dp[i][0]++;
            //dp[i][0]=dp[i][0]+MIN(MIN(dp[i-1][0],dp[i-1][4]),MIN(dp[i-1][1],dp[i-1][5]));
            dp[i][0]=dp[i][0]+(MIN4(dp[i-1][0],dp[i-1][1],dp[i-1][4],dp[i-1][5]));
            dp[i][2]=dp[i][0];
            //dp[i][1] dp[i][3]
            if(t[i-2].begin>t[i-1].end&&t[i].begin>t[i-1].end)dp[i][1]++;
            if(t[i-2].begin<t[i-1].end&&t[i].begin<t[i-1].end)dp[i][1]++;
            if(t[i-1].begin>t[i].begin&&t[i].end-t[i].begin!=0)dp[i][1]++;
            dp[i][1]=dp[i][1]+(MIN(MIN(dp[i-1][0],dp[i-1][4]),MIN(dp[i-1][1],dp[i-1][5])));
            dp[i][3]=dp[i][1];
            //dp[i][5] dp[i][7]
            if(t[i-2].end>t[i-1].end&&t[i].begin>t[i-1].end) dp[i][5]++;
            if(t[i-2].end<t[i-1].end&&t[i].begin<t[i-1].end) dp[i][5]++;
            if(t[i-1].end>t[i].begin&&t[i].end-t[i].begin>0) dp[i][5]++;
            dp[i][5]=dp[i][5]+(MIN(MIN(dp[i-1][2],dp[i-1][3]),MIN(dp[i-1][6],dp[i-1][7])));
            dp[i][7]=dp[i][5];
            //dp[i][4] dp[i][6]
            if(t[i-2].end>t[i-1].end&&t[i].end>t[i-1].end)dp[i][4]++;
            if(t[i-2].end<t[i-1].end&&t[i].end<t[i-1].end)dp[i][4]++;
            if(t[i-1].end<t[i].end) dp[i][4]++;
            dp[i][4]=dp[i][4]+(MIN(MIN(dp[i-1][2],dp[i-1][3]),MIN(dp[i-1][6],dp[i-1][7])));
            dp[i][6]=dp[i][4];
            }
            min=MAXN;
            for(j=0;j<8;j++)
                if(min>dp[i][j]) min=dp[i][j];
            kk[i]=min;

    }
    ans=MAXN;
    for(i=0;i<8;i++)
        if(ans>dp[brgr][i])ans=dp[brgr-1][i];
    printf("%d\n",ans);
}
int main()
{
    init();
    solve();
    return 0;
}
