コード:
#include <ビット/ STDC ++。H> に#define setIO(S)freopenは(S ".IN"、 "R"は、STDIN) の#define 200001 MAXN の#define INF 1000000000 の#define LSON(今<< 1) の#define rsonを( (現在<< 1)| 1) 名前空間stdを使用。 頼むchar型[10]。 INT HD [MAXN]、[MAXN << 1]、NEX [MAXN << 1]、V [MAXN]、DP [MAXN]であり; [MAXN]、[MAXN] LN、FA [MAXN]、ボット[MAXN]、[MAXN] DFNトップINT SIZ [MAXN]、HSON [MAXN]。 エッジをint型、nは、Q、ティム。 ボイド追加(INT U、V INT) { NEX [++エッジ] = HD [U]、HD [U] =縁、[エッジ]へ= V。 } ボイドDFS1(INT U、INT FF) { SIZ [U] = 1、FA [U] = FFを、 以下のために(INT I = HD [U]; I; I = NEX [I]) { int型V =乃至[I]。 (vは== FF)続けるならば、 DFS1(V、U); SIZ [U] + = SIZ [V]。 IF(SIZ [V]> SIZ [HSON [U])HSON [U] = V。 } } ボイドDFS2(INT U、int型のTP) { [++ティム] = U、DFN [U]は=ティム、トップ[U]は= TP LN。 (HSON [U])場合 DFS2(HSON [U]、TP)、ボット[U]はボット= [HSON [U]は]。 他の ボット[U] = U; 以下のために(INT I = HD [U]; I; I = NEX [I]) { int型V =乃至[I]。 (V == FA [U] || V == HSON [U])続行。 DFS2(V、V); } } ボイドDFS(INT U) { int型の和= 0。 以下のために(INT I = HD [U]; I; I = NEX [I]) { int型V =乃至[I]。 (V == FA [U] || V == HSON [U])続行。 DFS(V); 和+ = DP [V]。 } DP [U] =分(V [U]、合計)。 INT半ば=(L + R)>> 1。 } int型sumv [MAXN]、[MAXN] LMIN、ヴァル[MAXN]。 ボイド押し上げ(今INT) { [rson]をsumv + = sumv [LSON] [今] sumv。 LMIN [今] =分(LMIN [LSON]、sumv [LSON] + lmin0 [rson])。 } ボイドビルド(int型L、INT rは、今INT) { IF(L> R)のリターン; (L == R)なら 、{ int型、U = LN [L]、和= 0。 以下のために(INT I = HD [U]; I; I = NEX [I]) { int型V =乃至[I]。 (V == FA [U] || V == HSON [U])続行。 和+ = DP [V]。 } IF(和== 0) のval [U] = V [U]。 他 のval [U] =分(V [U]、合計)。 腕立て伏せ(今)。 返します。 } (L、中間、LSON)を構築します。 (ミッド+ 1、R、rson)を構築。 腕立て伏せ(今)。 } int型の照会(int型L、int型のR、今INT、INTのL、R INT) { IF(L> = L && R <= R) } int型のmain() { setIO( "入力")。 scanf関数( "%のD"、&N); ( "%d個"、&V [i])とscanfのため(++ I; iは= N <I = 1 INT)。 (++ iは; iがN <I = 1、U、V INT)のために { 追加(U、v)を、(uとV)を追加し、scanf関数( "%d個の%のD"、&U、およびV)。 } DFS1(1,0)、DFS2(1,1)、DFS(1)、DP [0] = INF構築(1、nは、1)。 scanf関数( "%d個"、&Q)。 (Q--)しながら { scanf関数( "%sの"、頼みます)。 IF(尋ねる[0] == 'C') { } IF(尋ねる[0] == 'Q') { } } 戻り0。