import
java.util.*;
class
GFG{
static
final
int
MAX =
100000
;
static
int
[]tree =
new
int
[
3
* MAX];
static
int
[]arr =
new
int
[MAX];
static
boolean
[]powerful =
new
boolean
[MAX +
1
];
static
boolean
isPowerful(
int
n)
{
while
(n %
2
==
0
)
{
int
power =
0
;
while
(n %
2
==
0
)
{
n /=
2
;
power++;
}
if
(power ==
1
)
return
false
;
}
for
(
int
factor =
3
;
factor <= Math.sqrt(n);
factor +=
2
)
{
int
power =
0
;
while
(n % factor ==
0
)
{
n = n / factor;
power++;
}
if
(power ==
1
)
return
false
;
}
return
(n ==
1
);
}
static
void
BuildArray(
int
input[],
int
n)
{
for
(
int
i =
0
; i < n; i++)
{
if
(powerful[input[i]])
arr[i] =
1
;
else
arr[i] =
0
;
}
return
;
}
static
int
getMid(
int
s,
int
e)
{
return
s + (e - s) /
2
;
}
static
void
constructSTUtil(
int
si,
int
ss,
int
se)
{
if
(ss == se)
{
tree[si] = arr[ss];
return
;
}
else
{
int
mid = getMid(ss, se);
constructSTUtil(
2
* si +
1
,
ss, mid);
constructSTUtil(
2
* si +
2
,
mid +
1
, se);
tree[si] = tree[
2
* si +
1
] +
tree[
2
* si +
2
];
}
}
static
void
updateValueUtil(
int
si,
int
ss,
int
se,
int
idx,
int
val)
{
if
(ss == se)
{
tree[si] = tree[si] - arr[idx] + val;
arr[idx] = val;
}
else
{
int
mid = getMid(ss, se);
if
(ss <= idx && idx <= mid)
updateValueUtil(
2
* si +
1
, ss,
mid, idx, val);
else
updateValueUtil(
2
* si +
2
, mid +
1
,
se, idx, val);
tree[si] = tree[
2
* si +
1
] +
tree[
2
* si +
2
];
}
}
static
int
queryPowerfulUtil(
int
si,
int
ss,
int
se,
int
l,
int
r)
{
if
(r < ss || se < l)
{
return
0
;
}
if
(l <= ss && se <= r)
{
return
tree[si];
}
int
mid = getMid(ss, se);
int
p1 = queryPowerfulUtil(
2
* si +
1
,
ss, mid, l,
r);
int
p2 = queryPowerfulUtil(
2
* si +
2
,
mid +
1
,
se, l, r);
return
(p1 + p2);
}
static
void
queryPowerful(
int
n,
int
l,
int
r)
{
System.out.printf(
"Number of Powerful numbers "
+
"between %d to %d = %d\n"
, l, r,
queryPowerfulUtil(
0
,
0
, n -
1
,
l, r));
}
static
void
updateValue(
int
n,
int
ind,
int
val)
{
if
(powerful[val])
updateValueUtil(
0
,
0
, n -
1
,
ind,
1
);
else
updateValueUtil(
0
,
0
, n -
1
,
ind,
0
);
}
static
void
precomputePowerful()
{
Arrays.fill(powerful,
false
);
for
(
int
i =
1
; i <= MAX; i++)
{
if
(isPowerful(i))
powerful[i] =
true
;
}
}
public
static
void
main(String[] args)
{
precomputePowerful();
int
input[] = {
4
,
5
,
18
,
27
,
40
,
144
};
int
n = input.length;
BuildArray(input, n);
constructSTUtil(
0
,
0
, n -
1
);
int
l =
0
, r =
3
;
queryPowerful(n, l, r);
int
i =
1
;
int
val =
9
;
updateValue(n, i, val);
queryPowerful(n, l, r);
}
}