無料のn個の点を考えると何のエッジを描画しない初期を表示する(1〜Nの番号が付け)。
m個の操作になりました3種類の合計を操作します:
- 「C AB」でも片側は、bは点とBの間の等しくてもよいです。
- 「Q1 AB」、呼び掛け点、bはaとbが同じであってもよい、ブロックと通信しています。
- 「Q2のA」、質問の数は、通信の途中に位置するブロックを指し示します。
入力形式
入力整数n及びmの最初の行。
続いて行をM、各操作指示、命令 "C AB" を含む行、 "Q1 AB" または "Q2のA" のいずれか。
出力フォーマット
各問い合わせ命令「Q1 AB」は、場合とBは、同じブロック内で「はい」の出力を伝え、そしてそうでなければ「いいえ」を出力しています。
各問い合わせ命令「Q2のA」、ブロック通信中点の整数点Aの出力のために
各結果行。
データ範囲
1 ≤ N 、M ≤ 10 5 1≤n、m≤105
サンプル入力:
5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5
出力例:
Yes
2
3
コード:
インポートjava.util.Scanner; パブリック クラスメイン{ 静的 int型N-、M; 静的 最終 int型 N = 100005 ; 静的 INT P [] = 新しい新しい INT [N]; 静的 int型のサイズ[] = 新しい新しい INTを [N]; //は、要素のコレクションを格納します番号、有効な唯一のルートノード 静的 int型の検索(INT X){ IF(P [X] = X!)P [X] = 検索(P [X]); 戻りP [X]。 } パブリック 静的 ボイドメイン(文字列[]引数){ スキャナのスキャン = 新しいスキャナ(System.in); N = scan.nextInt()。 M = scan.nextInt()。 以下のために(INT I 1 =; I <= N; I ++ ){ P [I] = I。 サイズ[I] = 1 。 } 一方、(M - > 0 ){ 文字列s = scan.next()。 もし(s.equals( "C" )){ int型 A = scan.nextInt()。 INT B = scan.nextInt()。 もし(()==見つける(b)に見つける。)続けます。 サイズ[検索(B)〕 + =サイズ[検索(A)]; // 最初の再結合し、そうでなければ繰り返し加え P [探す(A)] =は、(B)を探します。 } そう であれば(s.equals( "Q1" )){ int型 A = scan.nextInt()。 INT B = scan.nextInt()。 もしするSystem.out.println( "はい"(()==見つける(B)を見つけます。)); 他のSystem.out.println( "いいえ" ); } 他{ INT A = scan.nextInt()。 System.out.println(サイズ[見つける(A)])。 } } } }