using
System;
using
System.Linq;
using
System.Collections.Generic;
public
class
GFG {
static
int
getMid(
int
s,
int
e)
{
return
s + (e - s) / 2;
}
static
int
getSumUtil(
int
[] st,
int
ss,
int
se,
int
qs,
int
qe,
int
si)
{
if
(qs <= ss && qe >= se)
return
st[si];
if
(se < qs || ss > qe)
return
0;
int
mid = getMid(ss, se);
return
getSumUtil(st, ss, mid, qs, qe, 2 * si + 1)
+ getSumUtil(st, mid + 1, se, qs, qe,
2 * si + 2);
}
static
int
getSum(
int
[] st,
int
n,
int
qs,
int
qe)
{
if
(qs < 0 || qe > n - 1 || qs > qe) {
Console.WriteLine(
"Invalid Input"
);
return
-1;
}
return
getSumUtil(st, 0, n - 1, qs, qe, 0);
}
static
int
constructSTUtil(
int
[] arr,
int
ss,
int
se,
int
[] st,
int
si)
{
if
(ss == se) {
st[si] = arr[ss];
return
arr[ss];
}
int
mid = getMid(ss, se);
st[si]
= constructSTUtil(arr, ss, mid, st, si * 2 + 1)
+ constructSTUtil(arr, mid + 1, se, st,
si * 2 + 2);
return
st[si];
}
static
int
[] constructST(
int
[] arr,
int
n)
{
int
x = (
int
)(Math.Ceiling(Math.Log(n) / Math.Log(2)));
int
max_size = 2 * (
int
)Math.Pow(2, x) - 1;
int
[] st =
new
int
[max_size];
constructSTUtil(arr, 0, n - 1, st, 0);
return
st;
}
static
void
OddDivisorsSum(
int
n,
int
q,
int
[] arr,
int
[][] Query)
{
for
(
int
i = 0; i < n; i++) {
int
sq = (
int
)Math.Sqrt(arr[i]);
if
(sq * sq != arr[i])
arr[i] = 0;
}
int
[] st = constructST(arr, n);
for
(
int
i = 0; i < q; i++) {
int
l = Query[i][0];
int
r = Query[i][1];
Console.Write(getSum(st, n, l, r) +
" "
);
}
}
public
static
void
Main(
string
[] args)
{
int
[] arr = { 2, 4, 5, 6, 9 };
int
N = arr.Length;
int
Q = 3;
int
[][] Query = {
new
int
[] { 0, 2 },
new
int
[] { 1, 3 },
new
int
[] { 1, 4 } };
OddDivisorsSum(N, Q, arr, Query);
}
}