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)

#define _USE_MATH_DEFINES
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<set>
#include<map>
#include<stdbool.h>
#include<math.h>
#include<sstream>
#include<math.h>
#include<vector>
#include<functional>
#include<queue>
#include<utility>
#include<bitset>
typedef long long ll;
#define N (1000000000+7)
#define INF 1e10
using namespace std;
typedef pair<ll, ll> P;

bool prime[100010];
void furui() {
	prime[1] = true;
	int i = 2;
	while (i <= 100000) {
		int j = 2;
		while (j <= sqrt(i) && !prime[i]) {
			if (i%j == 0) {
				prime[i] = true;
				break;
			}
			else j++;
		}
		int z = 2;
		while (!prime[i]) {
			if (i*z <= 100000) {
				prime[i*z] = true;
				z++;
			}
			else break;
		}
		i++;
	}
}

bool odd[100010];
ll num[100010];

int main(void) {
	ll q;
	cin >> q;
	furui();
	for (ll i = 1;i <= 100000;i++) {
		odd[i] = false;
	}
	for (ll i = 1;i <= 100000;i++) {
		if ((i % 2 == 1) && (!prime[i]) && (!prime[(i + 1)/2])) {
			odd[i] = true;
		}
	}
	num[0] = 0;
	for (ll i = 1;i <= 100000;i++) {
		if (odd[i])num[i] = num[i - 1] + 1;
		else num[i] = num[i - 1];
	}
	ll l, r;
	for (ll i = 0;i < q;i++) {
		cin >> l >> r;
		cout << num[r] - num[l - 1] << endl;
	}
	return 0;
}