タイトル説明
イソプロピルまたは魔法の動作は、ほとんどの人はそれをまとめるほかを運ぶことはありません。
人生の中で... XOR演算も共通しています。例えば、質問に答えるために、それはそうでない場合は0その後、1:
(Aか男性)XOR(Bか男性)= AとBは、カップルになることができます
まあ、今は作ると複雑な状況に対処する必要があります。たとえば、私たちは木を与えるだろう、それはN個のノードを持っていることをうれしいです。ツリーの各側には重量があります。我々は右の2点間の経路上のXOR値のすべての側面を知りたい、毎回が求めて、M回をお願いしたいと思います。
入力形式
入力ファイルの最初の行は整数N、所有ノードの幸せZhekeツリーが含まれ、次の行n-1が存在し、これらの側面を説明し、各行は3つの数字、U、V、Wを有し、U及びVが表しますwは右辺の値を有します。整数Mがある次の行は、問い合わせの数を表します。M行の後に、各列二つの数字U、V、二点間の正しい道の排他的論理和のチャレンジ値を表します。
出力フォーマット
M本の出力線、各排他的論理和値を表す整数
サンプル入力と出力
入力#1
5 1 4 9644 2 5 15004 3 1 14635 5 3 9684 3 2 4 5 4 1
出力#1
975 14675 0
説明/ヒント
データの40%は、1≤N、M≤3000です。
データの100%に、それは1≤N、M≤100000です。
形而上学ツリーセクション
書式#include <アルゴリズム> 書式#include <cstdioを> する#include <ベクトル> 使用して 名前空間はstdを、 const int型 MAXN = 100000 + 10 。 ベクターは、 <対< INT、INT >> [MAXN]エッジ; INTのN、M、DIS [MAXN]。 インラインint型リード(){ int型、S = 0、W = 1 。 チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 ' ){ もし(CH == ' - ' ){ W = - 1 。 } CH = GETCHAR()。 } 一方、(CH> = ' 0 ' && CH <= ' 9 ' ){ S = sの* 10 + CH- ' 0 ' 。 CH = GETCHAR()。 } 戻り S * W。 } インラインボイド DFS(INT今、int型の fは、int型 XOR){ [今] DISを = Xorの。 以下のための(iは= SIZE_T 0 ; iはエッジを<今] .size(); iは++ ){ 場合(!エッジ[今] [i]が1次回= F){ DFS(エッジ[今] [i]が1次回、今、Xorの ^ [今]エッジ[I] .second)。 } } } INT {main()の N = )(読み取ります。 以下のために(int型 I = 1、U、V、Wは、iがN <; Iは++ ){ U =は、(読み取り) V = )(読み取ります。 W = 読み取り(); エッジ[U] .push_back(make_pair(V、W))。 エッジ[V] .push_back(make_pair(U、W))。 } DFS(1、1、1 )。 M = 読み取ります(); 以下のために(int型 I = 1 ; I <= M I ++は、U、V {) U =を読み取ります()。 V = )(読み取ります。 printf(" %d個の\ n "、DIS [U] ^ DIS [V])。 } 戻り 0 。 }