#include <bits/stdc++.h>
using namespace std;
#define ll long long

struct segTree{
    vector<ll> values;
    ll S = 1;

    ll q(int n, int l, int r, int ql, int qr){
        if(ql <= l && r <= qr) return values[n];
        if(r <= ql || qr <= l) return 0;
        int m = (l+r)/2;
        return q(2*n,l,m,ql,qr)+q(2*n+1,m,r,ql,qr);
    }

    ll query(int a, int b){return q(1, 0, S, a, b);}
    

    ll u(int n, int l, int r, int ql, int x){
        if(r <= ql || ql+1 <= l) return values[n];
        if(r-l==1) return (values[n]=x);
        int m = (l+r)/2;
        return (values[n]=(u(2*n,l,m,ql,x)+u(2*n+1,m,r,ql,x)));
    }

    ll update(int a, int b){return u(1, 0, S, a, b);}
    
    segTree(int N){
        while(S < N) S<<=1;
        values.resize(2*S);
        fill(values.begin(), values.end(), 0);
    }
};

ll numero_di_inversioni(vector<int> &V){
    vector<pair<int,int>> events; // (value, index)
    for(int i = 0; i < V.size(); i++) events.push_back({V[i], i});
    sort(events.begin(), events.end());

    segTree seg(2*V.size()+2);
    // now for each event i'll count how many inversions it has and add it to the segTree
    ll total_inversions = 0;
    for(auto[_, x] : events){
        total_inversions += seg.query(x, V.size()+1);
        seg.update(x, 1);
      //  for(auto a : seg.values) cerr << a << " "; cerr << endl;
    }

    //for(auto a : V) cerr << a << " "; cerr << " | " << total_inversions << endl;
    return total_inversions;
}

long long paletta_sort(int N, int V[]) {
    vector<int> A;
    vector<int> B;
    for(int i = 0; i < N; i++){
        if((i%2)==0) A.push_back(V[i]);
        else B.push_back(V[i]);
    }

    for(auto a : A) {if((a%2)==1) return -1;}
    for(auto a : B) {if((a%2)==0) return -1;}

    return numero_di_inversioni(A)+numero_di_inversioni(B);
}
