import
java.io.*;
import
java.util.*;
class
GFG
{
static
int
MAX =
1000001
;
static
int
prime[] =
new
int
[MAX];
static
void
SieveOfEratosthenes()
{
Arrays.fill(prime,
1
);
for
(
int
p =
2
; p * p <= MAX; p++)
{
if
(prime[p] ==
1
)
{
for
(
int
i = p * p; i <= MAX -
1
; i += p)
prime[i] =
0
;
}
}
}
static
int
getMid(
int
s,
int
e)
{
return
s + (e - s) /
2
;
}
static
int
getSumUtil(
int
[] st,
int
ss,
int
se,
int
qs,
int
qe,
int
si)
{
if
(qs <= ss && qe >= se)
return
st[si];
if
(se < qs || ss > qe)
return
0
;
int
mid = getMid(ss, se);
return
getSumUtil(st, ss, mid,
qs, qe,
2
* si +
1
)
+ getSumUtil(st, mid +
1
,
se, qs, qe,
2
* si +
2
);
}
static
void
updateValueUtil(
int
[] st,
int
ss,
int
se,
int
i,
int
diff,
int
si)
{
if
(i < ss || i > se)
return
;
st[si] = st[si] + diff;
if
(se != ss)
{
int
mid = getMid(ss, se);
updateValueUtil(st, ss, mid, i,
diff,
2
* si +
1
);
updateValueUtil(st, mid +
1
,
se, i, diff,
2
* si +
2
);
}
}
static
void
updateValue(
int
arr[],
int
[] st,
int
n,
int
i,
int
new_val)
{
if
(i <
0
|| i > n -
1
)
{
System.out.print(
"-1"
);
return
;
}
int
diff = new_val - arr[i];
int
prev_val = arr[i];
arr[i] = new_val;
if
((prime[new_val] | prime[prev_val]) !=
0
)
{
if
(prime[prev_val] ==
0
)
updateValueUtil(st,
0
, n -
1
,
i, new_val,
0
);
else
if
(prime[new_val] ==
0
)
updateValueUtil(st,
0
, n -
1
, i, -prev_val,
0
);
else
updateValueUtil(st,
0
, n -
1
,
i, diff,
0
);
}
}
static
int
getSum(
int
[] st,
int
n,
int
qs,
int
qe)
{
if
(qs <
0
|| qe > n -
1
|| qs > qe)
{
System.out.println(
"-1"
);
return
-
1
;
}
return
getSumUtil(st,
0
, n -
1
,
qs, qe,
0
);
}
static
int
constructSTUtil(
int
arr[],
int
ss,
int
se,
int
[] st,
int
si)
{
if
(ss == se) {
if
(prime[arr[ss]] !=
0
)
st[si] = arr[ss];
else
st[si] =
0
;
return
st[si];
}
int
mid = getMid(ss, se);
st[si] = constructSTUtil(arr, ss, mid,
st, si *
2
+
1
)
+ constructSTUtil(arr, mid +
1
,
se, st,
si *
2
+
2
);
return
st[si];
}
static
int
[] constructST(
int
arr[],
int
n)
{
int
x = (
int
)(Math.ceil(Math.log(n)/Math.log(
2
)));
int
max_size =
2
* (
int
)Math.pow(
2
, x) -
1
;
int
[] st =
new
int
[max_size];
constructSTUtil(arr,
0
, n -
1
, st,
0
);
return
st;
}
public
static
void
main(String[] args)
{
int
arr[] = {
1
,
3
,
5
,
7
,
9
,
11
};
int
n = arr.length;
int
Q[][] = { {
1
,
1
,
3
},
{
2
,
1
,
10
},
{
1
,
1
,
3
} };
SieveOfEratosthenes();
int
[] st = constructST(arr, n);
System.out.println(getSum(st, n,
1
,
3
));
updateValue(arr, st, n,
1
,
10
);
System.out.println(getSum(st, n,
1
,
3
));
}
}