#!/usr/bin/env python3 def main(): H, I = map(int, input().split()) roots = [i for i in range(H)] # Každý prvek je kořenem vlastné množiny sizes = [1 for _ in range(H)] unique = [H] def find(x): root = x # Hledáme kořen a přiřadíme ho do root while roots[root] != root: root = roots[root] # Hledáme znovu a přepisujeme přitom všechny pointery na správný kořen while roots[x] != x: x, roots[x] = roots[x], root return root def union(x, y): x, y = find(x), find(y) # Spojujeme kořeny if x == y: return # Stejné množiny nespojujeme roots[x] = y # Nasměrujeme kořen x do kořenu y sizes[y] += sizes[x] # K sizes[x] už nikdy nebudeme přistupovat unique[0] -= 1 # Pole je přístupné i uvnitř funkce, jinak stačí číslo for _ in range(I): inp = input() if inp[0] == "J": union(*map(int, inp[1:].split())) elif inp[0] == "S": a, b = map(int, inp[1:].split()) print("ANO" if find(a) == find(b) else "NE") elif inp[0] == "V": print(sizes[find(int(inp[1:]))]) elif inp[0] == "P": print(unique[0]) else: raise ValueError(f"Wrong operation code in '{inp}'.") if __name__ == "__main__": main()