1
+ #include < bits/stdc++.h>
2
+
3
+ using namespace std ;
4
+
5
+
6
+ const int N = 1e5 + 5 , mod = 1e9 + 7 ;
7
+
8
+ long long C[22 ][22 ];
9
+
10
+ struct poly {
11
+ int n;
12
+ int x[22 ];
13
+ poly (int n = 0 ) : n(n) {
14
+ memset (x, 0 , sizeof x);
15
+ }
16
+ void reset (int n = 0 ) {
17
+ this ->n = n;
18
+ memset (x, 0 , sizeof x);
19
+ }
20
+ long long get (long long p) {
21
+ long long ret = 0 , now = 1 ;
22
+ for (int i = 0 ; i <= n; i++) {
23
+ ret = (ret + 1LL * x[i] * now) % mod;
24
+ now = now * p % mod;
25
+ }
26
+ return ret;
27
+ }
28
+ void add (poly & other) {
29
+ for (int i = 0 ; i <= n; i++) {
30
+ x[i] += other.x [i];
31
+ if (x[i] >= mod) x[i] -= mod;
32
+ }
33
+ }
34
+ };
35
+
36
+ poly val[N], up[N];
37
+ long long ans[N];
38
+ int n, lv[N], k;
39
+ vector< int > g[N];
40
+
41
+ void dfs (int v, int par = -1 ) {
42
+ if (par != -1 )
43
+ val[v].add (val[par]);
44
+ for (int u : g[v]) {
45
+ lv[u] = lv[v] + 1 ;
46
+ dfs (u, v);
47
+ up[v].add (up[u]);
48
+ }
49
+ }
50
+
51
+ int main () {
52
+ int t;
53
+ scanf (" %d" , &t);
54
+ while (t--) {
55
+ int r = -1 ;
56
+ scanf (" %d %d" , &n, &k);
57
+ for (int i = 0 ; i < n; i++) g[i].clear ();
58
+ for (int i = 0 ; i < n; i++) {
59
+ int p;
60
+ scanf (" %d" , &p); p--;
61
+ if (p < 0 )
62
+ r = i;
63
+ else
64
+ g[p].push_back (i);
65
+ val[i].reset (k);
66
+ up[i].reset (k);
67
+ }
68
+ int q;
69
+ scanf (" %d" , &q);
70
+ for (int i = 0 ; i < q; i++) {
71
+ int y, z, x;
72
+ scanf (" %d %d" , &y, &z);
73
+ z--;
74
+ if (y == 2 ) {
75
+ for (int j = 0 ; j <= k; j++) {
76
+ scanf (" %d" , &x);
77
+ up[z].x [j] += x;
78
+ if (up[z].x [j] >= mod)
79
+ up[z].x [j] -= mod;
80
+ }
81
+ }
82
+ else {
83
+ for (int j = 0 ; j <= k; j++) {
84
+ scanf (" %d" , &x);
85
+ val[z].x [j] += x;
86
+ if (val[z].x [j] >= mod)
87
+ val[z].x [j] -= mod;
88
+ }
89
+ }
90
+ }
91
+ lv[r] = 1 ;
92
+ dfs (r);
93
+ for (int i = 0 ; i < n; i++)
94
+ ans[i] = (up[i].get (lv[i]) + val[i].get (lv[i])) % mod;
95
+ for (int i = 0 ; i < n; i++) printf (" %d " , ans[i]);
96
+ printf (" \n " );
97
+ }
98
+ return 0 ;
99
+ }
0 commit comments