#include <bits/stdc++.h>
#include <bitset>
#include <fstream>
using namespace std;
using ll = long long;
using P = pair<int, int>;
const int INF = 2147483647;
// 9,223,372,036,854,775,807
const ll INFL = 9223372036854775807;

/*!
* @struct UnionFind
* @brief ランク(木の高さ)を用いたUnion Find木
*
*/
template<class T>
struct UnionFind
{
    // rank[x] rootを0としたときの木の高さ
    vector<T> rank;
    // parents[x] xの親ノード
    vector<T> parents;
    /*!
        @fn UnionFind
        @param n ノード総数
        @return なし
        @brief コンストラクタ。親ノードは自身のノードNumberで初期化される 
    */
    UnionFind(){}
    UnionFind(T n){
        rank.resize(n,0);
        parents.resize(n,0);
        for(T i=0;i<n;i++){
            makeTree(i);
        }
    }
    /*!
        @fn makeTree
        @param x 
        @return なし
        @brief 親番号xのUnion Find木を作る。ノード数の最大値をxとする。
    */
    void makeTree(T x){
        parents[x] = x;
        rank[x] = 0;
    }
    /*!
        @fn findRoot
        @param x ノード番号x
        @return parents[x] ノード番号xの親ノード番号 
        @brief xの親ノード番号を再帰関数で発見する 
        @n \image html "./img/img1.jpg"
    */
    T findRoot(T x){
        if(x !=parents[x]){
            parents[x] = findRoot(parents[x]);
        }
        return parents[x];
    }
    /*!
        @fn isSame
        @param あるノード番号x,y 
        @return 
        @brief あるノードx,yが同じ親をもてば、true
    */
    bool isSame(T x,T y){
        return findRoot(x) == findRoot(y);
    }
    /*!
        @fn unite
        @param x,y ノードx,y
        @return true...x,yが同じ親。false...x,yが違う親
        @brief 木を結合する
    */
    bool unite(T x, T y){
        x = findRoot(x);
        y = findRoot(y);
        if(x == y) return false;
        if(rank[x] > rank[y]){
            parents[y] = x;
        }
        else{
            parents[x] = y;
            if(rank[x]==rank[y]){
                rank[y] ++;
            }
        }
        return true;
    }
};

int main() {
    ll n;

    cin >> n;
    vector<ll> a;
    ll maxtmp=0;
    for(int i=0;i<n;i++){
        ll tmp;
        cin >> tmp;
        a.push_back(tmp);
        maxtmp = max(maxtmp,tmp);
    }
    ll cnt=0;
    if(n%2==1){
        a.erase(a.begin()+n/2);
        n -=1;
    }
    // union find
    // aの最大値を入れる
    UnionFind<ll> tree(maxtmp+1);
    for(int i=0;i<n;i++){
        tree.makeTree(a.at(i));
    }
    for(int i=0;i<n/2;i++){
        if(a.at(i)!=a.at(a.size()-1-i)&&tree.isSame(a.at(i),a.at(a.size()-1-i))==false){
            cnt++;
            tree.unite(a.at(i),a.at(a.size()-i-1));
        }
    }
    cout << cnt << endl;
    return 0;
}
#include <bits/stdc++.h> 
#include<cmath>
#include<string>
#define pb push_back
#define x first
#define y second
#define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define all(x) x.begin(),x.end()
#define int long long
#define ll long long
using namespace std;
 
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
//void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
 
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif
// look for  all edge cases
//search for a pattern


int n;
const int nax = 2e5+2;
vector<int> v(nax), par(nax, -1);

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	
	//for(int i=1; i< nax; i++){
	
	//}
	
	for(int i=0; i<n; i++){
		cin >> v[i];
		par[v[i]] = v[i];
	}
	
	int l = 0, r = n-1;
	while(l < r){
		int a = v[l];
		int b = v[r];
		while(a != par[a]){
			int temp = a;
			a = par[a];
			par[temp] = par[a];
		}	
		while(b != par[b]){
			int temp = b;
			b = par[b];
			par[temp] = par[b];
		}
		if(a != b){
			par[a] = b;
		}
		l++;
		r--;
	}
	int ans = 0;
	for(int i=1; i< nax; i++){
		if(par[i] == -1)
			continue;
		
		if(par[i] != i)
			ans += 1;
	}
	cout << ans;
	
	return 0;
}
