#pragma GCC最適化(2) の#include <ビット/ STDC ++ H> に#define lowbit(x)は、x&( - X) 使用 名前空間STDを、 CONSTの INT MAXN = 1E6 + 108 。 typedefの長い 長いLL。 CONST LL MOD = 1E9 + 7 。 INTのN、Q。 INT FA [MAXN]、DFN [MAXN]、SIZ [MAXN]、DEP [MAXN]。 ベクター < INT > E [MAXN]。 インラインINT DFS(INT CUR){ 静的 INT TOT = 0 。 DFN [CUR] = ++TOT; ため(登録をint i = 0 ; iは、Eを<CUR] .size(); ++ I){ int型 =にE [CUR] [I]。 SIZ [CUR] + = DFS(へ)。 } // のprintf( "デバッグDFN [%のD] =%Dを\ n"、CUR、DFN [CUR])。 戻る ++ SIZ [CUR]。 } 構造体BIT { [MAXN] O LL。 インラインボイドのinit(){ memsetの(O、0、はsizeof (O))。 } インラインボイド更新(int型のPOS、LLのヴァル){ 一方(POS <= N){ O [POS] =([POS] +ヴァルO)%MOD。 POS + = lowbit(POS)。 } } インラインLLクエリ(int型POS){ LL RES = 0 。 一方(POS){ RESの =(RES + O [POS])%MOD。 POS - = lowbit(POS)。 } 戻り RES%MOD。 } } atom1、atom2の。 INT メイン(){ #ifndefのONLINE_JUDGE freopenは(" 1.TXT "、" R "、STDIN)。 #endifの scanf関数(" %のD "、&N) 用(登録をint i = 2 ; iが<= N; ++ I){ scanf関数(" %のD "、&FA [I])。 。E [FA [I] emplace_back(I)。 DEP [I] = DEP [FA [I] + 1 。 } atom1.init()。 atom2.init(); DFS(1 )。 scanf関数(" %のD "、&Q)。 int型のタイプ、V、X; LL K; 一方、(q-- ){ scanf関数(" %のD "、&タイプ); もし(タイプ== 1 ){ scanf関数(" %D%D%LLD "、&V、およびX&K)。 atom1.update(DFN [V]、X + DEP [V] * k個の%のMOD)。 atom1.update(DFN [V] + SIZ [V]、mod-(X + DEP [V] * k個の%のMOD)%のMOD)。 atom2.update([V]、K DFN)。 ([V] DFN atom2.update + SIZ [V]、(MOD-K%MOD)%のMOD)。 } 他{ scanf関数(" %のD "、&V)。 printf("「(atom1.query([V])%MOD-DEP DFN [V] * atom2.query([V])%のMOD + MOD DFN)%のMOD); } } 戻り 0 ; }