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 Haskell (GHC 7.10.3) (judge verdict: Wrong Answer)

import Control.Monad (replicateM)
import Data.Set as Set hiding (map, filter, foldl)
import Data.Map as Map hiding (map, filter, foldl)
import Data.Maybe

data Hoge = Hoge { hoge_f :: Map Int Int, hoge_m :: Map Int Int, hoge_s :: Map Int (Set Int) }

emptyHoge = Hoge { hoge_f = Map.empty, hoge_m = Map.empty, hoge_s = Map.empty }

lookupHoge :: Int -> Hoge -> Maybe (Int, Int, Set Int)
lookupHoge x h = case Map.lookup x (hoge_f h) of
    Nothing -> Nothing
    Just m_index -> Just (m_index, s_index, s)
        where
            s_index = fromJust $ Map.lookup m_index (hoge_m h)
            s       = fromJust $ Map.lookup s_index (hoge_s h)

unionHoge :: Int -> Int -> Int -> Set Int -> Set Int -> Hoge -> Hoge
unionHoge mi_y si_x si_y s_x s_y h = Hoge {
        hoge_f = (hoge_f h),
        hoge_m = Map.insert mi_y si_x (hoge_m h),
        hoge_s = Map.insert si_x (Set.union s_x s_y) $ Map.insert si_y Set.empty (hoge_s h)
    }

addElem :: Int -> Int -> Int -> Set Int -> Hoge -> Hoge
addElem e mi si s h = Hoge {
        hoge_f = Map.insert e mi (hoge_f h),
        hoge_m = (hoge_m h),
        hoge_s = Map.insert si (Set.insert e s) (hoge_s h)
    }

newPair :: (Int, Int) -> Hoge -> Hoge
newPair (x, y) h  = Hoge {
        hoge_f = Map.insert x new_mi $ Map.insert y new_mi (hoge_f h),
        hoge_m = Map.insert new_mi new_si (hoge_m h),
        hoge_s = Map.insert new_si new_s (hoge_s h)
    }
        where
            new_mi = 1 + Map.size (hoge_m h)
            new_si = 1 + Map.size (hoge_s h)
            new_s  = Set.fromList [x, y]

addPair :: Hoge -> (Int, Int) -> Hoge
addPair h p@(x, y) = case (lookupHoge x h, lookupHoge y h) of
    (Just (mi_x, si_x, s_x), Just (mi_y, si_y, s_y)) -> if si_x == si_y then h else unionHoge mi_y si_x si_y s_x s_y h
    (Just (mi_x, si_x, s_x), Nothing) -> addElem y mi_x si_x s_x h
    (Nothing, Just (mi_y, si_y, s_y)) -> addElem x mi_y si_y s_y h
    (Nothing, Nothing) -> newPair p h

equals :: [Int] -> [(Int, Int)] -> Int
equals l pairs = (length noNeedToMove) + (sum $ map countIn sets)
    where
        m = foldl addPair emptyHoge pairs
        noNeedToMove = filter (\(i,x)->i == x && Map.notMember x (hoge_f m)) $ zip [1..] l
        sets = Map.elems $ hoge_s m
        countIn s = length $ filter isMember $ map at $ Set.toList s
            where
                at i = l !! (i - 1)
                isMember x = Set.member x s

main = do
    [n, m] <- (map read . words) <$> getLine
    l <- (map read . words) <$> getLine
    pairs <- map (map read . words) <$> replicateM m getLine --  :: IO [[Int]]
    print $ equals l $ map (\[x,y]->(x,y)) pairs