Problem:
Score : 400 points

Problem Statement

We say that a odd number N is similar to 2017 when both N and (N+1)/2 are prime.

You are given Q queries.

In the i-th query, given two odd numbers l_i and r_i, find the number of odd numbers x similar to 2017 such that l_i ≤ x ≤ r_i.

Constraints

1≤Q≤10^5

1≤l_i≤r_i≤10^5

l_i and r_i are odd.

All input values are integers.

Input

Input is given from Standard Input in the following format:

Q
l_1 r_1
:
l_Q r_Q

Output

Print Q lines. The i-th line (1≤i≤Q) should contain the response to the i-th query.

Sample Input 1

1
3 7

Sample Output 1

2

3 is similar to 2017, since both 3 and (3+1)/2=2 are prime.

5 is similar to 2017, since both 5 and (5+1)/2=3 are prime.

7 is not similar to 2017, since (7+1)/2=4 is not prime, although 7 is prime.

Thus, the response to the first query should be 2.

Sample Input 2

4
13 13
7 11
7 11
2017 2017

Sample Output 2

1
0
0
1

Note that 2017 is also similar to 2017.

Sample Input 3

6
1 53
13 91
37 55
19 51
73 91
13 49

Sample Output 3

4
4
1
1
1
2

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define REP(i, n) for(int i=0;i<int(n);++i)
using namespace std;
template<class A>void pr(A a){cout << a << endl;}
template<class A,class B>void pr(A a,B b){cout << a << " "  ;pr(b);}
template<class A,class B,class C>void pr(A a,B b,C c){cout << a << " " ;pr(b,c);}
template<class A,class B,class C,class D>void pr(A a,B b,C c,D d){cout << a << " " ;pr(b,c,d);}
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
int INF=numeric_limits<int>::max();
// for(int j=0;j<N;++j) {}

int main(void) {
  int q;cin>>q;
  int l[q+10];
  int r[q+10];
  int max_r=0;
  REP(i,q) {
    cin>>l[i]>>r[i];
    max_r=max(max_r,r[i]);
  }
  int max_i=(max_r-1)/2;

  int S[max_i+10];

  bitset<1000000> is_primary(0);
  for(int i=2;i<=max_r;++i) is_primary.set(i);
  for(int i=2;i<=max_r;++i) {
    if(is_primary[i]) {
      for(int j=2*i;j<=max_r;j+=i) {
        is_primary.reset(j);
      }
    }
  }

  // pr("====");

  S[0]=0;
  for(int i=1;i<=max_i;++i) {
    if(is_primary[2*i+1]&&is_primary[i+1]) S[i]=S[i-1]+1;
    else S[i]=S[i-1];
    // pr(2*i+1,i+1,S[i],is_primary[2*i+1]&&is_primary[i+1]);
  }

  // pr("====");

  // for(int i=1;i<=max_i;++i) {
  //   pr(2*i+1,S[i]);
  // }

  REP(i,q) {
    int R = (r[i]-1)/2;
    int L = max((l[i]-1)/2,1);
    // pr(S[R],S[L-1],S[R]-S[L-1]);
    pr(S[R]-S[L-1]);
  }

  return 0;
}