#include <iostream>
#include <stdio.h>
#include <vector>

#define pb push_back

using namespace std;

const int MAXN = 100100;

int n, a[MAXN];
vector<int> vec;
bool inVec[MAXN];
vector<int> pos[MAXN];
int sz, idxList[MAXN], mn[MAXN];
int ans;

void read() {
    for(int i = 0; i < n; i ++) {
        scanf("%d", &a[i]);
        if(!inVec[ a[i] ]) {
            vec.pb(a[i]);
            inVec[ a[i] ] = true;
        }
        pos[ a[i] ].pb(i);
    }
}

void solve() {
    for(int i = 0; i < vec.size(); i ++) {
        for(int j = 0; j < pos[ vec[i] ].size(); j ++)
            idxList[sz ++] = pos[ vec[i] ][j];
    }

    mn[n - 1] = idxList[n - 1];
    for(int i = n - 2; i >= 0; i --)
        mn[i] = min(mn[i + 1], idxList[i]);

    for(int i = 0; i < n - 1; i ++)
        if(a[ idxList[i] ] != a[ idxList[i + 1] ] && mn[i + 1] < idxList[i])
            ans ++;

    cout << ans << endl;
}

void brute() {
    vector<int> x, y;
    x.resize(n);
    for(int i = 0; i < n; i ++)
        scanf("%d", &x[i]);
    while(x.size() > 0) {
        bool fl = false;
        y.clear();
        for(int i = 0; i < x.size(); i ++)
            if(x[i] != x[0]) y.pb(x[i]);
            else {
                if(y.size() > 0) fl = true;
            }
        ans += fl;
        x = y;
    }
    cout << ans << endl;
}

int main()
{
    scanf("%d", &n);
    if(n <= 16) {
        brute();
        return 0;
    }
    read();
    solve();

    return 0;
}
