その木部、および宗教点レンジセグメントツリーメンテナンス間隔でダイナミックオープンを開くために、最大とSUM 正規ツリーが同じ部分を処理することができるように、。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 100005 4 の#define半ば(L + R >> 1) 5 構造体JI { 6 int型NEX、であり; 7 }エッジ[N << 1 ]。 8 int型の E、V、N、M、X、Y、R W [N]、[N]、C [N]、ヘッド[N]、FA [N]、SH [N]、SZ [N]、MA [N]、トップ[N]、ID [N]、LS [N * 40 ]、RS [N * 40 ]、[N * F 40 ] [ 2 ]。 9 チャー S [ 11 ]。 10 ボイドアドオン(int型のx、int型Y){ 11 エッジ[E] .nex = 頭部[X]。 12 エッジ[E] .TO = Y。 13 頭[X] = E ++ 。 14 } 15 INTアップ(int型のx、int型 Y、INT P){ 16 であれば(P)リターン X + Y。 17 リターンMAX(X、Y) 18 } 19 空隙更新(INT&K、int型の L、int型の R、int型のx、int型のY){ 20 であれば、K = ++(K!)V。 21 場合(lは== R){ 22 F [k]が[ 0 ] = F [K] [ 1 ] = yと、 23 リターン; 24 } 25 であれば(X <= MID)更新(LS [k]は、L、中、X、Y) 26 他の更新(RS [k]は、中間+ 1 、R、X、Y)。 27 のためには、(int型 i = 0 ; iは< 2 ; iは++)F [K] [i]は= 最大(F [LSは、[K] [I]、F [RSは、[K] [i]は、I)。 28 } 29 INTクエリ(INT K、int型の L、int型の R、int型のx、int型の Y、INT P){ 30 であれば(!K)((X> R)||(L> Y)||)戻り 0 ; 31 であれば((X <= 1)&&(R <= Y))リターン[K] [P] F。 32 リターンアップ(クエリ(LS [k]は、L、中、X、Y、P)、クエリ(RS [k]は、中間+ 1 、R、X、Y、P)、P)。 33 } 34の 空隙 DFS(int型 K、int型の F、int型の){ 35 FA [k]は= fは、 36個の SH [K] =のS。 37 SZ [K] = 1 。 38 のための(int型 I =ヘッド[k]を、I = - !1 ; I = エッジ[I] .nex) 39 であれば!(エッジ[I] .TO = F){ 40の DFS(エッジ[I] .TO、K、S + 1 )。 41の SZ [K] + = SZ [エッジ[I] .TO]。 42 であれば(SZ [MA [K] <SZ [エッジ[I] .TO])MA [K] = エッジ[I] .TO。 43 } 44 } 45 空隙 DFS2(int型 K、int型T){ 46 ID [K] = ++ X。 47 更新(R [C [] K]、1、N- 5 、X、W [K])。 48 トップ[k]は= Tと、 49 もし(MA [K])DFS2(MA [K]、T)。 50 のために(int型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[i]は.nex) 51 であれば((エッジ[I] .TO = FA [K])&&(エッジ[I]!。 !へ= MA [K]))DFS2(エッジ[I] .TO、エッジ[I] .TO)。 52 } 53 INT CALC(INT K、int型のx、int型の Y、int型P){ 54 INT ANS = 0 。 55 一方(上面[X] =!トップ[Y]){ 56 であれば(SH [TOP [X] < SH [トップ[Y])スワップ(X、Y) 57の ANS =最大(ANS、クエリ(K、1、N-5 、ID [トップ[X]、ID [X]、P)、P)。 58 X = FA [TOP [X]]。 59 } 60 であれば(SH [X]> SH [Y])スワップ(X、Y) 61 リターンアップ(ANS、クエリ(K、1、N- 5 、ID [x]は、ID [Y]、P)、P)。 62 } 63 INT メイン(){ 64 のscanf(" %D%dの"、&N、&M)。 65 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 66 のために(int型 I = 1のscanf(; iが<= N I ++)は、 " %D%dの"、&W [i]は、&C [I])。 67 のために(int型 i = 1 ; iがN <; Iは++ ){ 68 のscanf(" %D%dの"、およびX&Y)。 69 追加(X、Y) 70 追加(Y、X)。 71 } 72の DFS(1、1、0 ); 73 X = 0 。 74 DFS2(1、1 )。 75 のために(int型 I = 1 ; I <= M Iは++ ){ 76 scanf関数(" %sの%D%D "、S、およびX&Y)。 77 であれば(S [ 0 ] == ' Q ' ){ 78 のprintf(" %Dを\ n "、計算値(R [C [X]、X、Y、S [ 1 ] == ' S ' )); 79 続け; 80 } 81 であれば(S [ 1 ] == ' W ')[X] = W yと; 82 他{ 83 更新(R [C [X]、1、N- 5、ID [X]、0 ); 84個の C [X] = Y。 85 } 86 更新(R [C [X]、1、N- 5 、ID [X]、W [X])。 87 } 88 }