#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <stdlib.h>
using
namespace
__gnu_pbds;
using
namespace
std;
typedef
tree<
int
, null_type, less_equal<
int
>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
const
int
mxN = (
int
)1e5;
bool
prime[mxN + 1];
void
SieveOfEratosthenes()
{
memset
(prime,
true
,
sizeof
(prime));
for
(
int
p = 2; p * p <= mxN; p++) {
if
(prime[p]) {
for
(
int
i = p * p;
i <= mxN; i += p)
prime[i] =
false
;
}
}
}
int
countSubarray(
int
arr[],
int
n,
int
k)
{
ordered_set s;
int
sum = 0;
for
(
int
i = 0; i < (
int
)k; i++) {
s.insert(arr[i]);
sum += arr[i];
}
int
avgsum = sum / k;
int
ans = 0;
int
med = *s.find_by_order(
(k + 1) / 2 - 1);
if
(avgsum - med >= 0
&& ((prime[med] == 0
&& prime[avgsum] == 0)
|| (prime[med] != 0
&& prime[avgsum] != 0))) {
ans++;
}
for
(
int
i = 0; i < (
int
)(n - k); i++) {
s.erase(s.find_by_order(
s.order_of_key(arr[i])));
s.insert(arr[i + k]);
sum -= arr[i];
sum += arr[i + k];
avgsum = sum / k;
med = *s.find_by_order(
(k + 1) / 2 - 1);
if
(avgsum - med >= 0
&& ((prime[med] == 0
&& prime[avgsum] == 0)
|| (prime[med] != 0
&& prime[avgsum] != 0))) {
ans++;
}
}
return
ans;
}
int
main()
{
SieveOfEratosthenes();
int
arr[] = { 2, 4, 3, 5, 6 };
int
K = 3;
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
cout << countSubarray(arr, N, K);
return
0;
}