#include using namespace std; using LL = long long; LL io[200001]; LL oi[200001]; // 幅優先探索. // https://ja.wikipedia.org/wiki/幅優先探索 // 操作パターンを幅優先探索する. // ※bfsの動作確認用. // @param c: 探索地点のインデックス. // @param o: 操作回数. // @param o: 探索回数 を 返却. LL bfs(LL c, LL o){ // 1. 終了条件確認. LL ret = o; if(io[c] == c) return ret; // 2. 空のキュー. queue q; // 3. 訪問済みフラグ設定. // -> 特に設定しない. // io[c] = c; // 4. 探索地点 c をキュー q に追加. q.push(c); while(!q.empty()){ // 5. キューから取り出す. LL v = q.front(); q.pop(); // 6. 取り出した要素を処理. // 未訪問(io[v] != v) であれば, 以下の条件にしたがって, 訪問済みを設定. // cout << "io[" << v << "]=" << io[v] << " oi[" << v << "]=" << oi[v] << " ret=" << ret << endl; if(io[v] != v) q.push(oi[v]), io[oi[v]] = io[v], io[v] = v, ret++; } // 7. 探索回数 を 返却. return ret; } int main() { // 1. 入力情報取得. LL N, K; cin >> N >> K; for(LL i = 1; i < N + 1; i++){ LL d; cin >> d; io[i] = d, oi[d] = i; } // 2. K回の操作で戻せるか? LL count = 0; for(LL i = 1; i < N + 1; i++) count += bfs(i, 0); // 3. 判定. string ans = "NO"; LL diff = K - count; if(diff >= 0 && diff % 2 == 0) ans = "YES"; // 4. 後処理. cout << ans << endl; return 0; }