五百年後、ドラゴンボールの数が予想外に増加しますので、猿王(悟空)が一緒にドラゴンボールのすべてを収集することは非常に困難です。
彼の国では、N個の都市を持っており、世界でもNドラゴンボールはまさにそこにあります。まず、i番目のドラゴンボールのために、神聖なドラゴンの意志は、i番目の都市でそれを置きます。長い年月を経て、いくつかの都市のドラゴンボール(S)は、他の都市に輸送されるだろう。物理的強度を保存するには悟空ドラゴンボールを収集するためにフライングニンバス雲、魔法の飛行雲を取ることを計画しています。
悟空が1つのドラゴンボールの情報を収集するたびに、彼はあなたにそのボールの情報を聞いてきます。あなたはボールが配置されている都市を彼に伝える必要がありますし、どのように多くのドラゴンボールがその都市であり、あなたもボールがこれまでに搬送された回数を彼に伝える必要があります。
彼の国では、N個の都市を持っており、世界でもNドラゴンボールはまさにそこにあります。まず、i番目のドラゴンボールのために、神聖なドラゴンの意志は、i番目の都市でそれを置きます。長い年月を経て、いくつかの都市のドラゴンボール(S)は、他の都市に輸送されるだろう。物理的強度を保存するには悟空ドラゴンボールを収集するためにフライングニンバス雲、魔法の飛行雲を取ることを計画しています。
悟空が1つのドラゴンボールの情報を収集するたびに、彼はあなたにそのボールの情報を聞いてきます。あなたはボールが配置されている都市を彼に伝える必要がありますし、どのように多くのドラゴンボールがその都市であり、あなたもボールがこれまでに搬送された回数を彼に伝える必要があります。
入力のInputThe最初の行は、単一の正の整数T(0 <T <= 100)です。
N及びQ(2 <N <= 10000、2 <Q <= 10000):それぞれの場合について、最初の行は、2つの整数を含んでいます。
以下のQラインの各々は以下のフォーマットとして事実や質問のいずれかを含む:
TABを:Aと同じ都市にあるすべてのドラゴンボールがでB番目ボール都市に輸送されている次の2つの都市と仮定することができます。異なっています。
QA:悟空はX(都市アトボールのIDである)、YとZ(ATHボールのtranporting回)(X番目の都市でボールのカウントを)知ってほしいです。(1 <= A、B <= N)OutputFor各テストケースは、出力サンプル出力としてフォーマットさテストケース番号。次に各クエリ、出力のための3つの整数値XYZを持つ行が空白space.Sample入力によるsaparated
2 3 3 T 1 2 T 3 2 Q 2 3 4 T 1 2 Q 1 、T 1 3 Q 1
サンプル出力
1ケース: 2 3 0 ケース2: 2 2 1 3 3 2。
互いに素なセット右と
// この質問は真珠の街を離れて移動したときに、この街は無用です,,,ピットを感じている、パールに対して何ら動きは存在しません // TAB(AとBはドラゴンボールです)ので、パールインデックスのルートノードは、彼の都市に対応して、 // そのルートうまくなるように1つの都市を見つける私たちはドラゴンボールを必要とする場合。パールの都市の数を求めて、 // このツリーのルートに子ノードの数を見つけることが(と彼が考えられている)以上のもの。主な需要はドラゴンボールの動きの数です。 // 我々は、我々はこれらの二つの真珠のルートノードを接続する2つのパールを接続する場合は0に初期化されたレコードの配列を、開け // し、我々は、ルート移動させ、その後、上のルートノードを聞かせてそのモバイルノード,,, ,,。 #include <cstdioを> する#include <CStringの> 使用して 名前空間STD; のconst int型 N = 1E5 + 7。; int型 ; FA [N]を// 親ノードレコード INT息子[N]を; // サイズツリー記録 int型 RAN [N]を。// 移動のレコード番号 INT(検索INT X){ IF(X == FA [X]) を返すFA [X]; 他{ int型 K = FA [X]; FA [X] = (FA [X])を検索するステップと、 RAN [X] RAN = + [K]; //は、これは主に、ルートノードの移動を送信するために使用されます。 戻るFA [X]; } } 無効に参加(int型の Xを、int型Yを){ int型(X)= FXを見つけ、FYは= ;(Y)の検索 IF(!FX = FY){ FA [FX] = FY; 息子[ FY] + = ソン[FX]。 RAN [FX] ++; // 移動ルートをさせ } } // 初期 空隙 inint(INT X){ memsetの(RAN、0、はsizeof (RAN)); のための(INT I = 1 ; Iは、= Xを<。 ++ I ){ FA [I] = I; 息子[I] = 1 ; } } int型のmain(){ int型の T、KK = 0 ; scanfの(" %のD "、&T)、 一方(T-- ){ 株式会社 ++ 。 のprintf(" ケース%D:\ nを" 、(株)); INTのN、M。 scanf関数(" %d個の%のD "、&N、&M)。 inint(N) 以下のために(int型 iは= 1 ; iが<= M; iは++ ){ char型 [ 10 ]。 scanf関数(" %sの" 、A)。 もし([ 0 ] == ' T ' ){ int型X、Y。 scanf関数(" %D%D "、&X、& (x、y)が参加。 } そう であれば([ 0 ] == ' Q ' ){ int型のZ。 scanf関数(" %のD "、&Z)。 INT、M = (z)を見つけます。 printf(" %D%D%D \ n " 、M、息子[m]は、[Z] RAN)。 } } } 戻り 0 。 }