using
System;
class
Query
{
public
int
L;
public
int
R;
public
int
index;
public
int
odd;
public
int
even;
}
class
Program
{
static
int
block;
static
int
count_oddP;
static
void
Add(
int
currL,
int
[] a)
{
if
(Convert.ToString(a[currL], 2).Replace(
"0"
,
""
).Length % 2 == 1)
count_oddP++;
}
static
void
Remove(
int
currR,
int
[] a)
{
if
(Convert.ToString(a[currR], 2).Replace(
"0"
,
""
).Length % 2 == 1)
count_oddP--;
}
static
void
QueryResults(
int
[] a,
int
n, Query[] q,
int
m)
{
count_oddP = 0;
block = (
int
)Math.Sqrt(n);
Array.Sort(q, (x, y) => {
if
(x.L / block != y.L / block)
return
x.L / block - y.L / block;
return
x.R - y.R;
});
int
currL = 0, currR = 0;
for
(
int
i = 0; i < m; i++)
{
int
L = q[i].L, R = q[i].R;
while
(currR <= R)
{
Add(currR, a);
currR++;
}
while
(currL > L)
{
Add(currL - 1, a);
currL--;
}
while
(currR > R + 1)
{
Remove(currR - 1, a);
currR--;
}
while
(currL < L)
{
Remove(currL, a);
currL++;
}
q[i].odd = count_oddP;
q[i].even = R - L + 1 - count_oddP;
}
}
static
void
PrintResults(Query[] q,
int
m)
{
Array.Sort(q, (x, y) => x.index - y.index);
for
(
int
i = 0; i < m; i++)
{
Console.WriteLine(q[i].odd +
" "
+ q[i].even);
}
}
static
void
Main(
string
[] args)
{
int
[] arr = { 5, 2, 3, 1, 4, 8, 10, 12 };
int
n = arr.Length;
Query[] q = {
new
Query { L = 1, R = 3, index = 0 },
new
Query { L = 0, R = 4, index = 1 },
new
Query { L = 4, R = 7, index = 2 } };
int
m = q.Length;
QueryResults(arr, n, q, m);
PrintResults(q, m);
}
}