#include <iostreamの> 使用して 名前空間STD; constの 整数 N = 50010 ; INT N-、M; INT P [N]は、D [N]; // Pは馬場、dは距離であり 、INT(検索INT X){ IF(P [X] = X){!は// xがルートでない場合 、INT T =(P [X])を探す; // ルートノードが完成となるように割り当てた後に、それを保存する点 D [X] + = D [ P [ X]]; // の間の距離のルートノードへのルートとの距離に更新== +親の親ノード P [X] = T; // 次に、ルートに割り当て } リターンP [X]; } int型のmain(){ scanfの(" %のD%のD "、およびN-、&M) のための(INT I = 1 ; I <= N; I ++)P [I] = I; //はそれ自体を初期化するには、収集され int型 RES = 0 ; / / で数嘘 一方(M - ){ int型 T、X、Y; // Tは、問い合わせの種類を表し scanfの(" %D%D%D "、T&&X&Y)を、 IF(X> || Y N-> N-)RES ++; // アウト範囲は、存在する 他{ int型 PX =見つける(X)を、Pyを見つける=(Y)は、//を見つけるルート IF(T ==1){ // 同じ場合 IF(PX == Pyを&&(D [X] - D [Y])%3)// 3%の設定した場合との範囲であった RES ++; // 嘘 他 IF(!PX = PY){ // ルートノードが異なる場合、セットではない P [PX = PY; // のルートのPX、PYに入れ D [ピクセル] = D [Y ] - D [X] ; // 同じクラスので、それは3%に等しく、距離の差が直接 } } 他 { //は食べ物を食べる表すのX、Y、次いでD [X] -d [Y] = 1の場合。 IF(PX == &&のPy (D [X] - D [Y] - 1)%3)// の設定した場合ではなく、1 ++ RES; // 嘘 他 IF(PX = Pyと!){ // そうでない場合の組 P [PX = Pyと; // マージ D [PX] = D [Y] + 1 - D [X]。 } } } } のprintf(" %D \ N- " 、RES); 戻り 0 ; }