type t = { mutable x : int; mutable y : int }

let split_on_char sep s =
  let open String in
  let r = ref [] in
  let j = ref (length s) in
  for i = length s - 1 downto 0 do
    if get s i = sep then begin
      r := sub s (i + 1) (!j - i - 1) :: !r;
      j := i
    end
  done;
  sub s 0 !j :: !r

let readln () = read_line () |> split_on_char ' ' |> List.map int_of_string

let find_set s x =
  let rec doit x =
    if x <> s.(x).x then s.(x).x <- doit (s.(x).x);
    s.(x).x in
  doit x

let unite s x y =
  let (a, b) = (find_set s x, find_set s y) in
  if s.(a).y > s.(b).y then s.(b).x <- a
  else begin
    s.(a).x <- b;
    if s.(a).y = s.(b).y then s.(b).y <- s.(b).y + 1
  end

let solve n q =
  let s = Array.init n (fun i -> { x = i; y = 0 }) in
  for i = 0 to q - 1 do
    match readln () with
    | n :: x :: y :: _ ->
      if n = 0 then unite s x y
      else print_endline (if find_set s x = find_set s y then "1" else "0")
    | _ -> assert false
  done

let () =
  match readln () with
  | [n; q] -> solve n q
  | _ -> assert false