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>
using namespace std;
#define ll int64_t
const ll mod = 1000000007;

const ll LINF = 1e13;
const ll LLINF = 1e18;
const ll ALPHABET = 26;

template <class T>
void Swap(T& r, T& l) {
  T tmp = r;
  r = l;
  l = tmp;
}

template<typename T>
istream& operator >> (istream& is, vector<T>& vec) {
  for (T& x : vec) is >> x; //for(int i=0; i<vec.size(); i++) is >> x[i]; とかでもいい
  return is;
}


vector<ll> Eratosthenes(ll n) {
  vector<bool> prime(n, false);
  vector<ll> val;
  for (int i = 0; i < n; i++) {
    prime[i] = 1;
  }
  prime[0] = prime[1] = 0;

  for (int i = 0; i < n; i++) {
    if (prime[i]) {
      for (int j = i + i; j < n; j += i) {
        prime[j] = 0;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (prime[i])val.push_back(i);
  }
  return val;
}

void eratosthenesbool(vector<bool> &prime,ll n){
    for (int i = 0; i < n; i++) prime[i] = 1;
    prime[0] = prime[1] = 0;
    for (int i = 0; i < n; i++){
        if(prime[i]){
            for(int j = i + i; j < n; j+=i){
                prime[j] = 0;
            }
        }
    }
}



int main() {
  ll q;
  cin >> q ;


  ll num =100001;

  vector<ll> l(q);
  vector<ll> r(q);

  for (int i = 0; i < q; ++i)
  {
    cin >> l[i] >> r[i];
  }
  // vector<ll> prim = Eratosthenes(num);

  vector<bool> primbool(num, false);
  eratosthenesbool(primbool,num-1);
  // for(auto v:prim){
  //   primbool[v] = true;
  // }

  vector<ll> lis(num,0);

  for(ll i = 2;i<num;i++){
    lis[i] = lis[i-1];
    if ( primbool[i] == true && primbool[ (i+1)/2 ] ==true  && i%2==1 ){
      lis[i]++;
    }
  }

  for(int i=0;i<15;i++){
    cerr << primbool[i]  << ",";
  }cerr <<endl;


  for(int i=0;i<15;i++){
    cerr << lis[i]  << ",";
  }cerr <<endl;

  for(int i=0;i<q;i++){
    cout << lis[r[i]] - lis[l[i]-1] <<endl;
  }
  // cout << ans;

}