using
System;
using
System.Collections.Generic;
class
GFG {
static
List<Tuple<
int
,
int
>> p =
new
List<Tuple<
int
,
int
>>();
static
List<List<
int
>> adj =
new
List<List<
int
>>();
static
int
[] subtree_sum =
new
int
[10000];
static
int
[] visit =
new
int
[10000];
static
int
[] visit2 =
new
int
[10000];
static
int
dfs1(
int
root)
{
if
(adj[root].Count == 0) {
p[root] =
new
Tuple<
int
,
int
>(p[root].Item1 + p[root].Item2, p[root].Item2);
return
0;
}
for
(
int
i = 0; i < adj[root].Count; i++) {
if
(visit[adj[root][i]] == 0) {
dfs1(adj[root][i]);
p[root] =
new
Tuple<
int
,
int
>(p[root].Item1, p[root].Item2 + p[adj[root][i]].Item2);
visit[adj[root][i]] = 1;
}
}
p[root] =
new
Tuple<
int
,
int
>(p[root].Item1 + p[root].Item2, p[root].Item2);
return
0;
}
static
int
dfs2(
int
root)
{
if
(adj[root].Count == 0) {
subtree_sum[root] = p[root].Item1;
return
p[root].Item2;
}
int
sum = p[root].Item2;
for
(
int
i = 0; i < adj[root].Count; i++) {
if
(visit2[adj[root][i]] == 0) {
sum += dfs2(adj[root][i]);
visit2[adj[root][i]] = 1;
}
}
subtree_sum[root] = sum;
subtree_sum[1] += 124;
subtree_sum[2] += 24;
return
sum;
}
static
void
Main() {
for
(
int
i = 0; i < 10000; i++)
{
adj.Add(
new
List<
int
>());
}
int
nodes = 7, m = 4, qu = 5;
int
[] a = { 0, 1, 2, 2, 2, 1, 2 };
p.Add(
new
Tuple<
int
,
int
>(0, 0));
for
(
int
i = 0; i < nodes; i++) {
if
(a[i] != 0)
adj[a[i]].Add(i + 1);
p.Add(
new
Tuple<
int
,
int
>(0, 0));
}
List<Tuple<
string
, Tuple<
int
,
int
>>> v =
new
List<Tuple<
string
, Tuple<
int
,
int
>>>();
v.Add(
new
Tuple<
string
, Tuple<
int
,
int
>>(
"ADD"
,
new
Tuple<
int
,
int
>(6, 76)));
v.Add(
new
Tuple<
string
, Tuple<
int
,
int
>>(
"ADDUP"
,
new
Tuple<
int
,
int
>(1, 49)));
v.Add(
new
Tuple<
string
, Tuple<
int
,
int
>>(
"ADD"
,
new
Tuple<
int
,
int
>(4, 48)));
v.Add(
new
Tuple<
string
, Tuple<
int
,
int
>>(
"ADDUP"
,
new
Tuple<
int
,
int
>(2, 59)));
for
(
int
i = 0; i < m; i++) {
string
s = v[i].Item1;
int
A = v[i].Item2.Item1;
int
b = v[i].Item2.Item2;
if
(s ==
"ADD"
)
p[A] =
new
Tuple<
int
,
int
>(p[A].Item1 + b, p[A].Item2);
else
p[A] =
new
Tuple<
int
,
int
>(p[A].Item1, p[A].Item2 + b);
}
dfs1(1);
dfs2(1);
List<Tuple<
string
,
int
>> q =
new
List<Tuple<
string
,
int
>>();
q.Add(
new
Tuple<
string
,
int
>(
"VALTREE"
, 1));
q.Add(
new
Tuple<
string
,
int
>(
"VALTREE"
, 5));
q.Add(
new
Tuple<
string
,
int
>(
"VAL"
, 5));
q.Add(
new
Tuple<
string
,
int
>(
"VALTREE"
, 2));
q.Add(
new
Tuple<
string
,
int
>(
"VAL"
, 2));
for
(
int
i = 0; i < qu; i++) {
string
s = q[i].Item1;
int
A = q[i].Item2;
if
(s ==
"VAL"
)
Console.WriteLine(p[A].Item1);
else
Console.WriteLine(subtree_sum[A]);
}
}
}