#!/usr/bin/env python3
import sys
import math
import random
import os
from io import BytesIO, IOBase
FAST_IO_BUFSIZE = 8192
class FastIO(IOBase):
newlines = 0
def __init__(self, file):
self._file = file
self._fd = file.fileno()
self.buffer = BytesIO()
self.writable = "x" in file.mode or "r" not in file.mode
self.write = self.buffer.write if self.writable else None
def read(self):
while True:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, FAST_IO_BUFSIZE))
if not b:
break
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines = 0
return self.buffer.read()
def readline(self):
while self.newlines == 0:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, FAST_IO_BUFSIZE))
self.newlines = b.count(b"\n") + (not b)
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines -= 1
return self.buffer.readline()
def flush(self):
if self.writable:
os.write(self._fd, self.buffer.getvalue())
self.buffer.truncate(0), self.buffer.seek(0)
class IOWrapper(IOBase):
def __init__(self, file):
self.buffer = FastIO(file)
self.flush = self.buffer.flush
self.writable = self.buffer.writable
self.write = lambda s: self.buffer.write(s.encode("ascii"))
self.read = lambda: self.buffer.read().decode("ascii")
self.readline = lambda: self.buffer.readline().decode("ascii")
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")
import copy
class Dsu:
par = []
sz = []
num_sets = 0
size = 0
def __init__(self, n):
self.par = [i for i in range(n)]
self.sz = [1 for i in range(n)]
self.num_sets = n
self.size = n
def reset(self, n):
if n > self.size:
self.par += [i for i in range(self.size, n)]
self.sz += [1 for i in range(self.size, n)]
self.size = n
for i in range(n):
self.par[i] = i
self.sz[i] = 1
self.num_sets = n
def find(self, a):
if self.par[a] == a:
return a
self.par[a] = self.find(self.par[a])
return self.par[a]
def union(self, a, b):
a = self.find(a)
b = self.find(b)
if a == b:
return
if self.sz[a] < self.sz[b]:
a, b = b, a
self.par[b] = a
self.sz[a] += self.sz[b]
self.num_sets -= 1
class solution:
lim = 2 * 10**5 + 5
cache = {}
dsu = Dsu(lim)
def memoize(self, func):
def wrapper(*args):
if args not in self.cache:
self.cache[args] = func(*args)
return self.cache[args]
return wrapper
def __init__(self) -> None:
pass
def solve(self) -> None:
t = int(input())
for _ in range(t):
self.solve_case()
def solve_case(self) -> None:
n, q = map(int, input().split())
ar = list(map(int, input().split()))
self.dsu.reset(n)
for _ in range(q):
a, b = map(int, input().split())
self.dsu.union(a - 1, b - 1)
groups = {}
for i in range(n):
root = self.dsu.find(i)
if root not in groups:
groups[root] = []
groups[root].append(i)
ans = 0
for group in groups.values():
nums = set([ar[i] for i in group])
for i in group:
if i + 1 in nums:
ans += 1
print(ans)
if __name__ == "__main__":
solution().solve()