タイトル説明
述べたように、互いに素セットは、今そこにある、あなたがマージし、クエリ操作を完了する必要があります。
入出力フォーマット
入力フォーマット:
最初の行は、2つの整数N、Mを含み、NはMの要素と操作の合計を表します。
次のM行、三つの整数紫、西、李を含む各行
場合紫= 1、Xi及び李の合成組
紫= 2の場合、Xi及びYiが同じセット内にある出力は、Y出力場合であり、それ以外の場合は、Nを出力します
出力フォーマット:
上記のように、紫= 2のそれぞれのための動作は、出力線を有し、各列は、大文字が含まれているか、またはYはNであります
サンプル入力と出力
説明
時間の制約:1000ミリ秒、128M
データスケール:
データの30%、N <= 10、M <= 20。
データの70%を、N <= 100、M <= 1000。
データの100%に、N <= 10000、M <= 200000。
解決策:説明エヘン咳、とああような質問親戚を必要としません。
// <ビット/ STDC ++ H>の#include の#include <iostreamの> する#include <アルゴリズム> の#include <キュー> の#include <cmath> の#include <CStringの> する#include <cstdlib> の#include <cstdioを> 使用して 名前空間STD。 int型 N、M、P、A、B、S1、S2、FA [ 10005 ]、ANS。 int型の検索(INT X){ 場合(FA [X] == x)をリターンX。 戻り FAを[X] = (FA [X])を見つけます。 } int型のmain(){ freopenは(" 3367.in "、R "STDIN); freopenは(" 3367.out " " W "STDOUT); scanf関数(" %D%dの」、&N、&M); のため(int型 i = 1 ; iが<= N; iが++) FAは[I] = I; 一方(M-- ){ scanf関数(" %D%D%D "、&P、&、&B); 場合(Pの== 1 ){ S1、S2 =; =(A)を見つけます(B)を見つける; もし(!S1 = S2)FA [S2] = S1; } 他 { 場合(見つける(A)== 検索(B)) のprintf(" Yの\ n " ); 他のprintf(" N \ nを" ); } } 戻り 0 。 }