Language: C++

#include<iostream>
using namespace std;

const int MAX_N = 100000;
int par[MAX_N];
int rank[MAX_N];

void init(int n){
  for(int i = 0 ; i < n ; i++){
    par[i] = i;
    rank[i] = 0;
  }
}

int find(int x){
  if(par[x] == x){
    return x;
  } else {
    return par[x] = find(par[x]);
  }
}

void unite(int x, int y){
  x = find(x);
  y = find(y);
  if (x == y) return;

  if(rank[x] < rank[y]){
    par[x] = y;
  } else {
    par[y] = x;
    if(rank[x] == rank[y])rank[x]++;
  }
}

bool same(int x, int y){
  return find(x) == find(y);
}


int main(){
  int N,M;
  int p[MAX_N];
  cin >> N >> M;
  for(int i = 0 ; i < N ; i++){
    cin >> p[i];
    p[i]--;
  }

  init(N);

  for(int i = 0 ; i < M ; i++){
    int x,y;
    cin >> x >> y;
    unite(x-1,y-1);
  }

  int count = 0;
  for(int i = 0 ; i < N ; i++){
    if(same(i,p[i]))count++;
  }
  cout << count << endl;

  return 0;
}


Compiler output:
a.cc: In function 'void init(int)':
a.cc:11:5: error: reference to 'rank' is ambiguous
   11 |     rank[i] = 0;
      |     ^~~~
In file included from /usr/include/c++/14/bits/move.h:37,
                 from /usr/include/c++/14/bits/exception_ptr.h:41,
                 from /usr/include/c++/14/exception:166,
                 from /usr/include/c++/14/ios:41,
                 from /usr/include/c++/14/ostream:40,
                 from /usr/include/c++/14/iostream:41,
                 from a.cc:1:
/usr/include/c++/14/type_traits:1437:12: note: candidates are: 'template<class> struct std::rank'
 1437 |     struct rank
      |            ^~~~
a.cc:6:5: note:                 'int rank [100000]'
    6 | int rank[MAX_N];
      |     ^~~~
a.cc: In function 'void unite(int, int)':
a.cc:28:6: error: reference to 'rank' is ambiguous
   28 |   if(rank[x] < rank[y]){
      |      ^~~~
/usr/include/c++/14/type_traits:1437:12: note: candidates are: 'template<class> struct std::rank'
 1437 |     struct rank
      |            ^~~~
a.cc:6:5: note:                 'int rank [100000]'
    6 | int rank[MAX_N];
      |     ^~~~
a.cc:28:16: error: reference to 'rank' is ambiguous
   28 |   if(rank[x] < rank[y]){
      |                ^~~~
/usr/include/c++/14/type_traits:1437:12: note: candidates are: 'template<class> struct std::rank'
 1437 |     struct rank
      |            ^~~~
a.cc:6:5: note:                 'int rank [100000]'
    6 | int rank[MAX_N];
      |     ^~~~
a.cc:32:8: error: reference to 'rank' is ambiguous
   32 |     if(rank[x] == rank[y])rank[x]++;
      |        ^~~~
/usr/include/c++/14/type_traits:1437:12: note: candidates are: 'template<class> struct std::rank'
 1437 |     struct rank
      |            ^~~~
a.cc:6:5: note:                 'int rank [100000]'
    6 | int rank[MAX_N];
      |     ^~~~
a.cc:32:19: error: reference to 'rank' is ambiguous
   32 |     if(rank[x] == rank[y])rank[x]++;
      |                   ^~~~
/usr/include/c++/14/type_traits:1437:12: note: candidates are: 'template<class> struct std::rank'
 1437 |     struct rank
      |            ^~~~
a.cc:6:5: note:                 'int rank [100000]'
    6 | int rank[MAX_N];
      |     ^~~~
a.cc:32:27: error: reference to 'rank' is ambiguous
   32 |     if(rank[x] == rank[y])rank[x]++;
      |                           ^~~~
/usr/include/c++/14/type_traits:1437:12: note: candidates are: 'template<class> struct std::rank'
 1437 |     struct rank
      |            ^~~~
a.cc:6:5: note:                 'int rank [100000]'
    6 | int rank[MAX_N];
      |     ^~~~