using
System;
class
GFG{
static
int
MAX_BITS = 32;
static
bool
isKthBitSet(
int
n,
int
k)
{
if
((n & (1 << (k - 1))) != 0)
{
return
true
;
}
return
false
;
}
static
int
[,] buildPrefixArray(
int
N,
int
[] arr)
{
int
[,] P =
new
int
[N + 1, MAX_BITS + 1];
for
(
int
i = 0; i <= MAX_BITS; i++)
{
P[0, i] = 0;
}
for
(
int
i = 0; i < N; i++)
{
for
(
int
j = 1; j <= MAX_BITS; j++)
{
if
(i != 0)
{
P[i, j] = P[i - 1, j];
}
bool
isJthBitSet = isKthBitSet(arr[i], j);
if
(isJthBitSet)
{
P[i, j]++;
}
}
}
return
P;
}
static
int
answerQuery(
int
L,
int
R,
int
K,
int
[,] P)
{
if
(L != 0)
{
return
P[R, K] - P[L - 1, K];
}
else
{
return
P[R, K];
}
}
static
void
answerQueries(
int
[,] queries,
int
Q,
int
[] arr,
int
N)
{
int
[,] P = buildPrefixArray(N, arr);
int
query_L, query_R, query_K;
for
(
int
i = 0; i < Q; i++)
{
query_L = queries[i, 0] - 1;
query_R = queries[i, 1] - 1;
query_K = queries[i, 2];
Console.WriteLine(
"Result for Query "
+
(i + 1) +
" = "
+
answerQuery(query_L,
query_R,
query_K, P));
}
}
static
public
void
Main()
{
int
[] arr = { 8, 9, 1, 3 };
int
N = arr.Length;
int
[,] queries = { { 1, 3, 4 }, { 2, 4, 1 } };
int
Q = queries.GetLength(0);
answerQueries(queries, Q, arr, N);
}
}