#include #include using namespace std; struct M{ int v0, v2, v20; }; M op(M a, M b){ M res; res.v0 = a.v0 + b.v0; res.v2 = a.v2 + b.v2; res.v20 = max({a.v20 + b.v0, a.v2 + b.v20, a.v2 + b.v0}); return res; } M e(){ return {0, 0, 0}; } int main(){ int N;cin >> N; assert(1 <= N && N <= 300000); vector A(N); vector> Ai(N); for(int i = 0; i < N; i++){ cin >> A[i]; assert(1 <= A[i] && A[i] <= N); Ai[A[i]-1].push_back(i); } atcoder::segtree seg(vector(2*N, {0, 1, 1})); int ans = INT_MAX; for(int i = 0; i < N; i++){ if(Ai[i].size() == 0) continue; int res = (N - Ai[i].size()) * 2; for(int j = 0; j < Ai[i].size(); j++){ int l = Ai[i][j], r = Ai[i][(j+1)%Ai[i].size()]; if(l >= r)r += N; res -= seg.prod(l + 1, r).v20; } for(auto idx: Ai[i]){ seg.set(idx, {1, 0, 1}); seg.set(idx + N, {1, 0, 1}); } ans = min(ans, res); } cout << ans << endl; }