全て呼掛け含むことが理解されるであろう〜R Lをルートノードへのパスがマークされている+1 タグを、次にクエリが対応する尋ねるZ 有するルートに多くのパス+1 マークが、この問題は、プレフィックスとオフライン処理にツリーを変換することができます。鎖セグメントツリーのメンテナンスのスプリットセット。
実際には、ブロックの一種であり、その前に答える各ブロックの各ノードに対して、各ブロックについて、に見出すことができるF [K] = F [FA] + SZ [k]は、 SZ [K] 表すk個のサブツリーのノード数、最初の前処理このブロックの演算fは、暴力外部ブロック(データ構造のない組が、定数が大きいほど、通過しないかもしれない)、最後のブロック内で直接計算することができます。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 50005 4 の#define L(K << 1) 5 の#define R(L + 1) 6 の#define中間(L + R >> 1) 7 の構造体JI { 8 int型のID、X、Y、Z。 9 ブール 演算子 <(CONSTの JI&A)のconst { 10 リターン X < 斧。 11 } 12 } Q [N << 1 ]。 13 構造体JI2 { 14 INT隣に; 15 }エッジ[N << 1 ]。 16 int型 E、N、M、X、Y、Z、K、SZ [N]、FA [N]、トップ[N]、ID [N]、ANS [N]、MA [N]、ヘッド[N] 、Lazの[N << 2 ]、F [N << 2 ]。 17 ボイド追加(int型のx、int型のY){ 18 エッジ[E] .nex = 頭部[X]。 19 エッジ[E] .TO = Y。 20 頭[X] = E ++ 。 21 } 22の 空隙 DFS(int型K){ 23 SZ [K] = 1 。 24 のために(int型 I =ヘッド[k]を、I = - !1; I = エッジ[I] .nex){ 25の DFS(エッジ[I] .TO)。 26の SZ [K] + = SZ [エッジ[I] .TO]。 27 であれば(SZ [エッジ[I] .TO]> SZ [MA [K])MA [K] = エッジ[I] .TO。 28 } 29 } 30 空隙 DFS2(int型 K、int型T){ 31 ID [K] = ++ X。 32 トップ[k]は= Tと、 33 であれば(MA [K])DFS2(MA [K]、T)。 34 のために(int型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[i]は.nex) 35 場合、エッジ[I] .TO(=!MA [K])DFS2(エッジ[I] .TO、エッジ[I] .TO)。 36 } 37 空隙アップ(int型 K、int型の P、int型の L、int型R){ 38 のLaz [K] + = P。 39 F [K] + = P *(R-L + 1 )。 40 } 41 ボイドダウン(int型 K、int型の L、INT R){ 42 アップ(L、のLaz [k]は、L、MID)。 43 アップ(R、Lazの[K]、ミッド+ 1 、R)。 44 のLaz [K] = 0 ; 45 } 46 ボイド更新(int型 K、int型の L、int型の R、int型のx、int型のY){ 47 であれば((L> Y)||(X> R))のリターン; 48 であれば((X <= 1)&&(R <= Y)){ 49 まで(K、1 、L、R)。 50 リターン; 51 } 52 更新(L、L、中、X、Y) 53 更新(R、中間+ 1 、R、X、Y)。 54 F [K] = F [L] + F [R] +のLaz [K] *(R-L + 1 )。 55 } 56 INTクエリ(INT K、int型の L、INTの R、int型のx、int型Y){ 57 であれば((L> Y)||(X> R))戻り 0 ; 58 であれば((X <= 1)&&(R <= Y))リターン[K] F。 59 ダウン(K、L、R)。 60 リターンクエリ(L、L、中、X、Y)+クエリ(R、中間+ 1 、R、X、Y)。 61 } 62 INT CALC(INT K){ 63 INT S = 0 。 64 のために(あり、k; = FA [トップ[K]] K)S + =クエリ(1、1 、nは、ID [トップ[K]、ID [K])。 65 リターン秒; 66 } 67 INT メイン(){ 68 のscanf(" %D%dの"、&N、&M)。 69 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 70 のためには、(int型、I = 2 ; iが<= N; iが++ ){ 71 のscanf(" %dの"、およびX) 72 (++追加X、I)。 73 FA [I] =のX。 74 } 75の DFS(1 )。 76 X = 0 。 77 DFS2(1、1 )。 78 のために(int型 I = 1 ; I <= M; iが++ ){ 79 のscanf(" %D%D%D "、およびX&Y、およびZ)。 80 であれば(X)Q [++ K] = JI {I、X、Z + 1、 - 1 }。 81 qは[++ k]はJI = {I、Y + 1、Z + 1、1 }。 82 } 83 ソート(Q + 1、Q + K + 1 )。 84 のための(int型 I = 1、J =1 ; iが<= N; iが++ ){ 85 のために(int型 K = Iであり; kは、= FA [トップ[K])更新(K 1、1 、nは、ID [トップ[K]、ID [k]を); 86 のために(; Q [J] .X == I、J ++)ANS [Q [J] .ID] + = CALC(Q [J] .Y)* Q [J] .Z。 87 } 88 のための(int型 I = 1 ; I <= M; iが++)のprintf(" %d個の\ n "、ANS [I]%201314を) 89 }