int型の検索(INT X){ 戻り?FA [X] == X X:FA [X] =見つける(FA [X]);}
#include < セット > の#include <マップ> の#include <cmath> の#include <キュー> の#include <ベクトル> の#include <cstdioを> する#include <cstdlib> の#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> 使用して 名前空間はstdを、 const int型 MAXN = 30001 ; 整数 nは、FA [MAXN]、DIS [MAXN]、高さ[MAXN]。チャー S [ 5 ]。 INT検索(INT X){ int型 FX = FA [X]。 もし(FA [X]!= X){ FA [X] =検索(FA [X]); // パスコンプレッサ DIS [X] = DIS + [FX]; // ラインのみ合成横断は場合 } 戻りFA [X]を。 } ボイド連合(int型のx、int型のY){ int型 FX =(X)を見つけるFY = (y)を見つけます。 4 [FY] = FX。 DIS [FY] = 高さ[FX]。 高さ[FX] + = 高さ[FY]。 } INT メイン(){ scanf関数(" %のD "、&N) 以下のために(INT iが= 0 ; I <MAXN; I ++)FA [I] = I、高さ[I] = 1 。 用(INT ; N - X、Y ); { scanf関数(" %S " 、S)。 もし(S [ 0 ] == ' M ')のscanf(" %D%D "、およびX&Y)、ユニオン(X、Y) 他のscanf(" %dの"、およびX)のprintf(" %D \ n "、高さ[見つける(X)] - DIS [X] - 1 )。 } リターン 0 ; }