#include #include #include using namespace std; int main(int argc, const char* argv[]) { int N; int64_t K; cin >> N >> K; int D[N]; for (auto&& d : D) cin >> d; // NOTE 循環するグループに分ける map m; map gm; int g = 1; for (int i = 1; i <= N; i++) { int d = D[i - 1]; int _g = m[i] ? m[i] : (m[d] ? m[d] : g++); gm[_g]++; m[i] = _g; m[d] = _g; } int64_t cnt = 0; for (auto&& tmp : gm) { cnt += max(tmp.second - 1, 0); } // NOTE 2,3回の倍数の交換は組み合わせで可能 bool ret = cnt == K || cnt + 2 <= K; cout << (ret ? "YES" : "NO") << endl; return 0; }