using
System;
using
System.Collections.Generic;
public
class
GFG {
static
int
N = (
int
)(1e5 + 5);
static
List<
int
>[] v =
new
List<
int
>[ N ];
static
int
[] val =
new
int
[N];
static
int
[] answer =
new
int
[N];
static
int
n;
static
int
gcd(
int
a,
int
b)
{
if
(b == 0)
return
a;
return
gcd(b, a % b);
}
static
void
DFS(
int
node,
int
parent)
{
answer[node] = val[node];
foreach
(
int
child
in
v[node])
{
if
(child == parent)
continue
;
DFS(child, node);
answer[node] = gcd(answer[node], answer[child]);
}
}
static
void
preprocess() { DFS(1, -1); }
static
void
findGCD(
int
[] queries,
int
q)
{
preprocess();
for
(
int
i = 0; i < q; i++) {
int
GCD = answer[queries[i]];
Console.Write(
"For subtree of "
+ queries[i]
+
", GCD = "
+ GCD +
"\n"
);
}
}
public
static
void
Main(String[] args)
{
n = 5;
for
(
int
i = 0; i < v.Length; i++)
v[i] =
new
List<
int
>();
v[1].Add(2);
v[2].Add(1);
v[1].Add(3);
v[3].Add(1);
v[3].Add(4);
v[4].Add(3);
v[3].Add(5);
v[5].Add(3);
val[1] = 2;
val[2] = 3;
val[3] = 4;
val[4] = 8;
val[5] = 16;
int
[] queries = { 2, 3, 1 };
int
q = queries.Length;
findGCD(queries, q);
}
}