ROPER - Biến đổi hoán vị

Tác giả: ladpro98

Ngôn ngữ: C++

#include <bits/stdc++.h>

using namespace std;

const int N = 100005;

int p[N];
int cycle[N];
int n, m, nCycle;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) cin >> p[i];
    for (int i = 1; i <= n; ++i) if (!cycle[i]) {
        ++nCycle;
        for (int j = i; !cycle[j]; j = p[j])
            cycle[j] = nCycle;
    }
    int u, v;
    while (m--) {
        cin >> u >> v;
        bool YES = cycle[u] == cycle[v];
        YES |= cycle[u] == cycle[1] && cycle[v] == cycle[2];
        YES |= cycle[u] == cycle[2] && cycle[v] == cycle[1];
        cout << (YES ? "Yes\n" : "No\n");
    }
    return 0;
}

Download