この質問は制限されていない場合、それはツリー状の配列+ DFS裸のタイトルシーケンスであります
最初の要求は、それが動的にツリーを変更する場合、維持することが困難で、配列が確かに変わりDFS、及びデータが大きい場合、暴力がTであるべきで、その後、動的寄与を所望その結果、混乱するかもしれません
したがって、すべてのノードは、DFS配列一旦、最初の操作のために必要なように、最初に完了したいです
私達はちょうど彼の前に、その位置マイナス和bouns DFS順序を必要とし、+の後にこれに戻ってくる位置に、そのように修飾することが、この点があり、かつ操作の要件と同等の新しいポイントとなりました
#include <iostreamの> する#include <cstdioを> する#include <cmath> の#include <アルゴリズム> の#include < ストリング > の#include <CStringの> する#include <マップ> の#include < セット > 使用して 名前空間STDを、 typedefの長い 長いLL。 CONST INT N = 1E6 + 10 。 const int型 INF = 0x3f3f3f3f 。 LL TR [N]。 LL MUL [N]。 LL bouns [N]。 INT IDX; int型の時間。 int型H [N]、E [N]、NE [N]、CNT = 1 。 構造体ノード{ INT タイプ; int型のID。 int型V; } Q [N]。 構造体Q { INT ST。 int型のED。 } POS [N]。 ボイド追加(int型、int型B){ E [IDX] = B、NE [IDX] = H [A]、H [A] = IDX ++ 。 } ボイド DFS(INT U){ POS [U] .ST = ++ 回; int型私は、 用 - ;(!i = iはH [U] = 1 ; iが= {NE [i])と INTをJ = E [i]は、 DFS(J)。 } POS [U] .ED = 時間; } INT lowbit(INT X){ リターン X& - X。 } ボイド ADD1(INT X、LL C){ int型のI。 用(; I <= CNT; I + = I = X lowbit(I)){ TR [I] + = C。 } } (SUM llの整数X){ int型のI。 LL RES = 0 。 以下のための(I = X; I; I- = lowbit(I)){ RES + = TR [I]。 } リターンのres; } int型のmain(){ int型I。 INT M、S。 CIN >> M >> S。 memsetの(H、 - 1、はsizeof H)。 以下のための式(I = 1 ; I <= M; I ++ ){ scanf関数(" %のD "、&Q [I] .TYPE)。 scanf関数(" %のD "、&Q [I] .ID)。 もし(Q [i]が.TYPE == 1 ){ CNT ++ 。 (Q [i]が.ID、CNT)を加えます。 Q [i]は.V =CNT; } そう であれば(Q [i]が.TYPE == 2 || Q [i]は.TYPE == 3 ){ scanf関数(" %のD "、&Q [I] .V)。 } } のためには、(iは= 1 ; I <= CNT; I ++ ) MUL [I] = S。 DFS(1 )。 以下のために(iは= 1 ; iが<= M; I ++ ){ 場合(Q [i]が.TYPE == 1 ){ LL TMP = SUM(POS [Q [I] .V] .ST)。 ADD1(POS [Q [I] .V] .ST、 - TMP)。 ADD1(POS [Q [I] .V] .ST + 1 、TMP)。 } そう であれば(Q [i]が.TYPE == 2 ){ LL TMP = SUM(POS [Q [i]は.ID] .ST)。 bouns [Q [I] .ID] + = TMP * MUL [Q [i]は.ID]。 MUL [Q [i]は.ID] = (LL)Q [I] .V。 ADD1(POS [Q [i]は.ID] .ST、 - TMP)。 ADD1(POS [Q [i]は.ID] .ST + 1 、TMP)。 } そう であれば(Q [i]が.TYPE == 3 ){ int型 place1 = POS [Q [i]は.ID] .ST。 int型 place2 =POS [Q [i]は.ID] .ED。 ADD1(place1、Q [i]は.V)。 ADD1(place2 + 1、 - Q [I] .V)。 } 他{ のprintf(" %のLLD \ n "、bouns [Q [I] .ID] + SUM(POS [Q [i]は.ID] .ST)* MUL [Q [I] .ID])。 } } }