Si cette question n'est pas une limite, il est un tableau arborescente + dfs nue séquence de titre
La première demande pourrait être source de confusion, ce qui entraîne la contribution dynamique souhaitée, si elle modifie dynamiquement l'arbre, la séquence dfs puis va certainement changer, difficile à maintenir, et les données est importante, la violence devrait être T
Par conséquent, souhaiter à tous les noeuds terminé premier, de sorte que la séquence ne sera plus nécessaire de DSF, et pour la première opération
Nous avons juste besoin de cette position moins la somme de l'ordre de boun devant lui, et en mesure de revenir à cette après +, donc il y a ce point à modifier, et est devenu un nouveau point, ce qui équivaut aux besoins de l'opération
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cmath> #include <algorithme> #include < string > #include <cstring> #include <map> #include < set > en utilisant l' espace de noms std; typedef longue longue ll; const int N = 1e6 + 10 ; const int inf = 0x3f3f3f3f ; ll tr [N]; ll mul [N]; bouns ll [N]; int idx; int fois; inth [N], E [N], ne [N], cnt = 1 ; struct noeud { int de type; int id; int v; q} [N]; struct q { int st; int ed; } pos [N]; vide add ( int a, int b) { e [idx] = b, ne [idx] = h [a], h [a] = idx ++ ; } Vides dfs ( int u) { pos [u] .ST = ++ fois; int i; pour (i = h [u]; i = - 1 ; i = ne [i]) { intj = e [i]; dfs (j); } Pos [u] .ED = temps; } Int lowbit ( int x) { retour x et - x; } Vide add1 ( int x, ll c) { int i; pour (i = x; i <= cnt; i + = lowbit (i)) { tr [i] + = c; } } Ll somme ( int x) { int i; ll res = 0 ; pour (i = x; i; i- = lowbit (i)) { res + = tr [i]; } Retour res; } Int main () { int i; int m, s; cin >> >> m s; memset (h, - 1 , sizeof h); pour (i = 1 ; i <= m; i ++ ) { scanf ( " % d " , et q [i] .type); scanf ( " % d " , et q [i] .id); si (q [i] .type == 1 ) { cnt ++ ; ajouter (q [i] .id, cnt); q [i] .v = Cnt; } Autre si (q [i] .type == 2 || q [i] .type == 3 ) { scanf ( " % d " , & q [i] .V); } } Pour (i = 1 ; i <= cnt; i ++ ) mul [i] = s; dfs ( 1 ); pour (i = 1 ; i <= m; i ++ ) { si (q [i] .type == 1 ) { ll tmp = somme (pos [q [i] .v] .ST); ADD1 (pos [q [i] .v] .ST, - tmp); ADD1 (pos [q [i] .v] .ST + 1 , tmp); } Autre si (q [i] .type == 2 ) { ll tmp = somme (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); } Autre si (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); } Autre { printf ( " % LLD \ n " , bouns [q [i] .id] + somme (pos [q [i] .id] .ST) * Mul [q [i] .id]); } } }