import
java.util.Arrays;
public
class
GFG {
static
final
int
MAX =
100001
;
static
final
int
SQRSIZE =
400
;
static
int
query_blk_sz;
static
class
Query {
int
L;
int
R;
public
Query(
int
l,
int
r)
{
L = l;
R = r;
}
}
static
int
[] frequency =
new
int
[MAX];
static
int
[] blocks =
new
int
[SQRSIZE];
static
int
blk_sz;
static
boolean
compare(Query x, Query y)
{
if
(x.L / query_blk_sz != y.L / query_blk_sz)
return
(x.L / query_blk_sz
< y.L / query_blk_sz);
return
x.R < y.R;
}
static
int
getblocknumber(
int
ind)
{
return
(ind) / blk_sz;
}
static
int
getans(
int
A,
int
B)
{
int
ans =
0
;
int
left_blk, right_blk;
left_blk = getblocknumber(A);
right_blk = getblocknumber(B);
if
(left_blk == right_blk) {
for
(
int
i = A; i <= B; i++)
ans += frequency[i];
}
else
{
for
(
int
i = A; i < (left_blk +
1
) * blk_sz;
i++)
ans += frequency[i];
for
(
int
i = left_blk +
1
; i < right_blk; i++)
ans += blocks[i];
for
(
int
i = right_blk * blk_sz; i <= B; i++)
ans += frequency[i];
}
return
ans;
}
static
void
add(
int
ind,
int
a[])
{
frequency[a[ind]]++;
int
block_num = getblocknumber(a[ind]);
blocks[block_num]++;
}
static
void
remove(
int
ind,
int
a[])
{
frequency[a[ind]]--;
int
block_num = getblocknumber(a[ind]);
blocks[block_num]--;
}
static
void
queryResults(
int
a[],
int
n, Query q[],
int
m,
int
A,
int
B)
{
query_blk_sz = (
int
)Math.sqrt(m);
Arrays.parallelSort(q, (x, y) -> {
if
(x.L / query_blk_sz != y.L / query_blk_sz)
return
(x.L / query_blk_sz
- y.L / query_blk_sz);
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++;
}
System.out.println(getans(A, B));
}
}
public
static
void
main(String[] args)
{
int
arr[] = {
3
,
4
,
6
,
2
,
7
,
1
};
int
N = arr.length;
int
A =
1
, B =
6
;
blk_sz = (
int
)Math.sqrt(N);
Query Q[] = {
new
Query(
0
,
4
) };
int
M = Q.length;
queryResults(arr, N, Q, M, A, B);
}
}