#include #define rep(i,n) for(int i=0;i<(int)(n);i++) using namespace std; using ll = long long ; using P = pair ; using pll = pair; constexpr int INF = 1e9; constexpr long long LINF = 1e17; constexpr int MOD = 1000000007; struct Unionfind{ vector parents; int m; Unionfind(int n):parents(n,-1){ m = n; } int find(int x){ if(parents.at(x) < 0){ return x; }else{ parents.at(x) = find(parents.at(x)); return parents.at(x); } } void unite(int x,int y){ x = find(x); y = find(y); if(x==y) return; if(parents.at(x) > parents.at(x))swap(x,y); parents.at(x) += parents.at(y); parents.at(y) = x; } int size(int x){ return -parents.at(find(x)); } bool same(int x,int y){ return find(x) ==find(y); } vector members(int x){ int root = find(x); vector A; for(int i=0;i> n >> k; vector a(n); rep(i,n) cin >> a[i]; Unionfind uf(n); rep(i,n){ uf.unite(i,i%k); } vector

A(n); rep(i,n){ A[i].first = a[i]; A[i].second = i; } sort(A.begin(),A.end()); bool ok = true; rep(i,n){ if(!uf.same(A[i].second,i)) ok = false; } if(!ok){ cout << -1 << endl; return 0; } int cnt = 0; vector> b(k,vector()); rep(i,n){ b[i%k].push_back(a[i]); } rep(i,k){ while(1){ bool update = false; rep(j,b[i].size()-1){ if(b[i][j] > b[i][j+1]){ swap(b[i][j],b[i][j+1]); update = true; cnt ++; } } if(!update) break; } } cout << cnt << endl; return 0; }