#include using namespace std; using ll = long long; using pll = pair; #define drep(i, cc, n) for (ll i = (cc); i <= (n); ++i) #define rep(i, n) drep(i, 0, n - 1) #define all(a) (a).begin(), (a).end() #define pb push_back #define fi first #define se second mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count()); const ll MOD1000000007 = 1000000007; const ll MOD998244353 = 998244353; const ll MOD[3] = {999727999, 1070777777, 1000000007}; const ll LINF = 1LL << 60; const int IINF = 1 << 30 - 1; template struct Edge{ int to; T w; Edge(int to_, T w_=1){ to = to_; w=w_; } }; template using Tree = vector>>; template using Graph = vector>>; /* 容量&重み付きエッジ for Dinic */ template struct REdge{ int to; T cap; T cost; int rev; REdge(int to_, T cap_, T cost_=1){ to = to_; cap = cap_; cost = cost_; } REdge(int to_, T cap_, T cost_, int rev_){ to = to_; cap = cap_; cost = cost_; rev = rev_; } }; /* 残余グラフ for Dinic */ template using RGraph = vector>>; struct UnionFind{ vector parent; vector sizes; UnionFind(ll N) : parent(N), sizes(N, 1){ rep(i, N) parent[i] = i; } ll root(ll x){ if (parent[x] == x) return x; return parent[x] = root(parent[x]); } void unite(ll x, ll y){ ll rx = root(x); ll ry = root(y); if (rx == ry) return; if (sizes[rx] < sizes[ry]) swap(rx, ry); sizes[rx] += sizes[ry]; parent[ry] = rx; } bool same(ll x, ll y){ ll rx = root(x); ll ry = root(y); return rx == ry; } ll size(ll x){ return sizes[root(x)]; } }; struct SegmentTree{ ll n; vector dat; SegmentTree(ll n_){ n = 1; while(n < n_) n*=2; dat.resize(2*n, 0); } void update(ll k, ll a){ k += n-1; dat[k] += a; while(k > 0){ k = (k-1)/2; dat[k] = dat[2*k+1]+dat[2*k+2]; } } // the minimun element of [a, b) ll query(ll a, ll b){return query_sub(a, b, 0, 0, n);} ll query_sub(ll a, ll b, ll k, ll l, ll r){ if(r <= a || b <= l){ return 0; }else if(a <= l && r <= b){ return dat[k]; }else{ ll vl = query_sub(a, b, 2*k+1, l, (l+r)/2); ll vr = query_sub(a, b, 2*k+2, (l+r)/2, r); return vl+vr; } } }; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); ll n, m; cin >> n >> m; vector p(n); rep(i, n){ cin >> p[i]; p[i]--; } ll cnt = 0; SegmentTree seg(n); rep(i, n){ cnt += seg.query(p[i]+1, n); seg.update(p[i], 1); } if(m%2==0){ if(cnt%2==1){ cout << -1 << endl; }else{ cout << cnt + (m-cnt%m)%m << endl; } }else{ ll l = cnt + (m-cnt%m)%m; if((l-cnt)%2==0){ cout << l << endl; }else{ cout << l+m << endl; } } }