import
java.util.ArrayList;
class
Graph{
static
class
Pair
{
int
first, second;
public
Pair(
int
first,
int
second)
{
this
.first = first;
this
.second = second;
}
}
@SuppressWarnings
(
"unchecked"
)
static
ArrayList<Integer>[] v =
new
ArrayList[
1001
];
static
ArrayList<Integer> s =
new
ArrayList<>();
static
int
[] seg =
new
int
[
1001
];
static
int
ar[] = {
0
,
1
,
2
,
3
,
4
,
5
,
6
};
static
int
vertices =
6
;
static
int
edges =
5
;
static
void
segment(
int
low,
int
high,
int
pos)
{
if
(high == low)
{
seg[pos] = ar[s.get(low)];
}
else
{
int
mid = (low + high) /
2
;
segment(low, mid,
2
* pos);
segment(mid +
1
, high,
2
* pos +
1
);
seg[pos] = seg[
2
* pos] + seg[
2
* pos +
1
];
}
}
static
int
query(
int
node,
int
start,
int
end,
int
l,
int
r)
{
if
(r < start || end < l)
{
return
0
;
}
if
(l <= start && end <= r)
{
return
seg[node];
}
int
mid = (start + end) /
2
;
int
p1 = query(
2
* node, start,
mid, l, r);
int
p2 = query(
2
* node +
1
, mid +
1
,
end, l, r);
return
(p1 + p2);
}
static
void
update(
int
pos,
int
low,
int
high,
int
idx,
int
val)
{
if
(low == high)
{
seg[pos] = val;
}
else
{
int
mid = (low + high) /
2
;
if
(low <= idx && idx <= mid)
{
update(
2
* pos, low, mid,
idx, val);
}
else
{
update(
2
* pos +
1
, mid +
1
,
high, idx, val);
}
seg[pos] = seg[
2
* pos] +
seg[
2
* pos +
1
];
}
}
static
int
dfs(
int
root)
{
s.add(root);
if
(v[root].size() ==
0
)
return
root;
for
(
int
i =
0
; i < v[root].size(); i++)
{
int
temp = dfs(v[root].get(i));
s.add(temp);
}
return
root;
}
public
static
void
main(String[] args)
{
for
(
int
i =
0
; i <
1001
; i++)
{
v[i] =
new
ArrayList<>();
}
v[
1
].add(
2
);
v[
1
].add(
3
);
v[
2
].add(
6
);
v[
2
].add(
5
);
v[
3
].add(
4
);
int
temp = dfs(
1
);
s.add(temp);
ArrayList<Pair> p =
new
ArrayList<>();
for
(
int
i =
0
; i <= vertices; i++)
p.add(
new
Pair(
0
,
0
));
for
(
int
i =
0
; i < s.size(); i++)
{
if
(p.get(s.get(i)).first ==
0
)
p.get(s.get(i)).first = i +
1
;
else
p.get(s.get(i)).second = i +
1
;
}
segment(
0
, s.size() -
1
,
1
);
int
node =
1
;
int
e = p.get(node).first;
int
f = p.get(node).second;
int
ans = query(
1
,
1
, s.size(), e, f);
System.out.println(
"Subtree sum of node "
+
node +
" is : "
+ (ans /
2
));
int
val =
10
;
node =
6
;
e = p.get(node).first;
f = p.get(node).second;
update(
1
,
1
, s.size(), e, val);
update(
1
,
1
, s.size(), f, val);
node =
2
;
e = p.get(node).first;
f = p.get(node).second;
ans = query(
1
,
1
, s.size(), e, f);
System.out.println(
"Subtree sum of node "
+
node +
" is : "
+ (ans /
2
));
}
}