Problem:
Score : 400 points

Problem Statement

We have a permutation of the integers from 1 through N, p_1, p_2, .., p_N.
We also have M pairs of two integers between 1 and N (inclusive), represented as (x_1,y_1), (x_2,y_2), .., (x_M,y_M).
AtCoDeer the deer is going to perform the following operation on p as many times as desired so that the number of i (1 ≤ i ≤ N) such that p_i = i is maximized:

Choose j such that 1 ≤ j ≤ M, and swap p_{x_j} and p_{y_j}.

Find the maximum possible number of i such that p_i = i after operations.

Constraints

2 ≤ N ≤ 10^5

1 ≤ M ≤ 10^5

p is a permutation of integers from 1 through N.

1 ≤ x_j,y_j ≤ N

x_j ≠ y_j

If i ≠ j, \{x_i,y_i\} ≠ \{x_j,y_j\}.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
p_1 p_2 .. p_N
x_1 y_1
x_2 y_2
:
x_M y_M

Output

Print the maximum possible number of i such that p_i = i after operations.

Sample Input 1

5 2
5 3 1 4 2
1 3
5 4

Sample Output 1

2

If we perform the operation by choosing j=1, p becomes 1 3 5 4 2, which is optimal, so the answer is 2.

Sample Input 2

3 2
3 2 1
1 2
2 3

Sample Output 2

3

If we perform the operation by, for example, choosing j=1, j=2, j=1 in this order, p becomes 1 2 3, which is obviously optimal.
Note that we may choose the same j any number of times.

Sample Input 3

10 8
5 3 6 8 7 10 9 1 2 4
3 1
4 1
5 9
2 5
6 5
3 5
8 9
7 9

Sample Output 3

8

Sample Input 4

5 1
1 2 3 4 5
1 5

Sample Output 4

5

We do not have to perform the operation.

Solution in Ruby (2.3.3) (judge verdict: Wrong Answer)

# coding: utf-8
class UnionFind
  attr :id, :rank

  def initialize(n)
    @id   = (0...n).to_a
    #@id   = array.dup
    #p @id
    #@rank = Array.new(@id.length,0)
    @rank = Array.new(n,0)
  end

  def root(i)
    if @id[i] == i or i == @id[@id[i]]
      i
    else
      @id[i] = root(@id[i])
      @id[i]
    end
  end

  # find, check if p and q has the same root
  def same?(p, q)
    root(p) == root(q)
  end

  # union, to merge components containing p and q
  # set id of p's root to the id of q's root
  def unite(p, q)

    i = root(p)
    j = root(q)

    return if i == j

    if @rank[i] < @rank[j]
      @id[i] = j
    else
      @id[j] = i;
      @rank[i]+=1  if @rank[i] == @rank[j]
    end
  end
end

lines = $stdin.read
array = lines.split("\n")
N,M = array[0].split(" ").map(&:to_i)
P   = array[1].split(" ").map(&:to_i)
M_h = array[2..M+2].map{|str| str.split(" ").map(&:to_i)}.to_h

un  = UnionFind.new(N)
M_h.each do |k,v|
  #puts "#{k}=>#{v}"
  un.unite(k-1,v-1)
end

#p un.id
#p P

@list = un.id.zip(P)
ans = 0

#p @list

for uniq_id in un.id.uniq
  #puts ""

  idxset = un.id.map.with_index(1) do |e,i|
    if e==uniq_id
      i
    else
      nil
    end
  end.reject{|e| e.nil?}

  #puts "--- movable idx ---"
  #p idxset
  movable = @list.select{|e| e.first==uniq_id}.map{|arr| arr.last}
  #puts "--- movable num ---"
  #p movable.sort

  #puts "--- and ---"
  #p idxset & movable
  ans += (idxset & movable).length
end

puts ans