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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

class Scanner
{
    private readonly char Separator = ' ';
    private int Index = 0;
    private string[] Line = new string[0];

    private T Convert<T>(string s)
    {
        return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(s);
    }

    public string Next()
    {
        if (Index >= Line.Length)
        {
            Line = Console.ReadLine().Split(Separator);
            Index = 0;
        }
        var ret = Line[Index];
        Index++;
        return ret;
    }

    public T Next<T>()
    {
        return Convert<T>(Next());
    }

    public int NextInt()
    {
        return int.Parse(Next());
    }

    public long NextLong()
    {
        return long.Parse(Next());
    }

    public string[] StringArray()
    {
        Line = Console.ReadLine().Split(Separator);
        Index = Line.Length;
        return Line;
    }

    public T[] Array<T>()
    {
        var l = StringArray();
        var res = new T[l.Length];
        for (int i = 0; i < l.Length; i++)
        {
            res[i] = Convert<T>(l[i]);
        }
        return res;
    }

    public int[] IntArray()
    {
        var l = StringArray();
        var res = new int[l.Length];
        for (int i = 0; i < l.Length; i++)
        {
            res[i] = int.Parse(l[i]);
        }
        return res;
    }

    public long[] LongArray()
    {
        var l = StringArray();
        var res = new long[l.Length];
        for (int i = 0; i < l.Length; i++)
        {
            res[i] = long.Parse(l[i]);
        }
        return res;
    }
}

class Program
{
    private int Max = 100000;
    private long[] Sum;

    private int Q;
    private int[] L, R;
    private void Scan()
    {
        var sc = new Scanner();
        Q = sc.NextInt();
        L = new int[Q];
        R = new int[Q];
        for (int i = 0; i < Q; i++)
        {
            L[i] = sc.NextInt();
            R[i] = sc.NextInt();
        }
    }

    private void Calc()
    {
        var isNotPrime = new bool[Max + 1];
        isNotPrime[0] = true;
        isNotPrime[1] = true;
        for (int i = 2; i * i <= Max; i++)
        {
            if (!isNotPrime[i])
            {
                for (int j = i + i; j <= Max; j += i)
                {
                    isNotPrime[j] = true;
                }
            }
        }
        bool[] A = new bool[Max + 1];
        for (int i = 0; i <= Max; i++)
        {
            A[i] = (!isNotPrime[i]) && (!isNotPrime[(i + 1) / 2]);
        }
        Sum = new long[Max + 1];
        for (int i = 1; i <= Max; i++)
        {
            Sum[i] = Sum[i - 1];
            if (A[i])
            {
                Sum[i]++;
            }
        }
    }


    public void Solve()
    {
        Scan();
        Calc();
        var sb = new StringBuilder();
        for (int i = 0; i < Q; i++)
        {
            sb.AppendLine((Sum[R[i]] - Sum[L[i] - 1]).ToString());
        }
        Console.Write(sb.ToString());
    }


    static void Main(string[] args)
    {
        new Program().Solve();
    }
}