import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
class
GFG {
static
final
int
mxx =
1000003
;
static
boolean
[] isPrime =
new
boolean
[
1000
];
static
int
[] segment =
new
int
[
4
* mxx];
static
Map<Long, Integer> primorial =
new
HashMap<>();
static
void
Sieve() {
Arrays.fill(isPrime,
true
);
isPrime[
0
] = isPrime[
1
] =
false
;
for
(
int
i =
2
; i <
1000
; i++) {
if
(isPrime[i]) {
for
(
int
j =
2
* i; j <
1000
; j += i)
isPrime[j] =
false
;
}
}
}
static
void
StorePrimorials() {
int
cnt =
0
;
long
product =
1
;
for
(
int
i =
2
; i < mxx && cnt <
15
; i++) {
if
(isPrime[i]) {
product *= (
long
) i;
primorial.put(product,
1
);
cnt++;
}
}
}
static
void
Build(
int
[] arr,
int
low,
int
high,
int
ind) {
if
(low == high) {
segment[ind] = primorial.containsKey((
long
) arr[low]) ?
1
:
0
;
return
;
}
int
mid = (low + high) >>
1
;
Build(arr, low, mid,
2
* ind +
1
);
Build(arr, mid +
1
, high,
2
* ind +
2
);
segment[ind] = segment[
2
* ind +
1
] + segment[
2
* ind +
2
];
}
static
void
Update(
int
low,
int
high,
int
ind,
int
pos,
int
val) {
if
(low == high) {
segment[ind] = primorial.containsKey((
long
) val) ?
1
:
0
;
return
;
}
int
mid = (low + high) >>
1
;
if
(pos >= low && pos <= mid)
Update(low, mid,
2
* ind +
1
, pos, val);
else
Update(mid +
1
, high,
2
* ind +
2
, pos, val);
segment[ind] = segment[
2
* ind +
1
] + segment[
2
* ind +
2
];
}
static
int
RangeQueries(
int
l,
int
r,
int
low,
int
high,
int
ind) {
if
(high < l || low > r)
return
0
;
if
(low >= l && high <= r)
return
segment[ind];
int
mid = (low + high) >>
1
;
return
(RangeQueries(l, r, low, mid,
2
* ind +
1
)
+ RangeQueries(l, r, mid +
1
, high,
2
* ind +
2
));
}
static
List<Integer> Count(
int
[] arr,
int
N, List<List<Integer>> queries) {
List<Integer> ans =
new
ArrayList<>();
Sieve();
StorePrimorials();
Build(arr,
0
, N -
1
,
0
);
for
(List<Integer> query : queries) {
if
(query.get(
0
) ==
1
) {
int
l = query.get(
1
);
int
r = query.get(
2
);
int
x = RangeQueries(l, r,
0
, N -
1
,
0
);
ans.add(x);
}
else
{
Update(
0
, N -
1
,
0
, query.get(
1
), query.get(
2
));
}
}
return
ans;
}
public
static
void
main(String[] args) {
int
[] arr = {
25
,
2
,
7
,
30
,
1
};
int
N = arr.length;
List<List<Integer>> queries =
new
ArrayList<>();
queries.add(Arrays.asList(
1
,
1
,
4
));
queries.add(Arrays.asList(
2
,
2
,
6
));
queries.add(Arrays.asList(
1
,
0
,
3
));
List<Integer> ans = Count(arr, N, queries);
for
(
int
x : ans)
System.out.print(x +
" "
);
}
}