Problem Statement:

Given a number N, let CP(N) denote the number of primes between 1 and N (inclusive of N). We call N a prime counter if CP(N) is a prime (N need not be a prime). 
For example, CP(3) = 2, CP(4) = 2, CP(5) = 2, CP(7) = 4.

Input Format:

First-line contains an integer T, a number of test cases. Next T lines each containing two positive integers L, R separated by space.

Output Format:

T lines containing the number of prime counters between L and R (both inclusive) in the ith test case (or NONE is no prime counter exists in that range).

Constraints:

L ≤ R ≤ 106

Example 1:

Input: 1
       1 10
Output: 4

Example 2:

Input: 2
       2 20
       21 30
Output: 8
        NONE

Code

import java.util.*;
import java.io.*;

class Innoskrit {
    
    public static void primeCounters(int ranges[][], int size) {
        
        boolean primeSieve[] = new boolean[size + 1];
        Arrays.fill(primeSieve, true);
        int cp[] = new int[size + 1];
        int primeCounters[] = new int[size + 1];
        
        primeSieve[0] = false;
        primeSieve[1] = false;
        
        for(int number = 2; number <= size; number++) {
            
            if(primeSieve[number]) {
                cp[number] = cp[number - 1] + 1;
            } else {
                cp[number] = cp[number - 1];
            }
            
            if(primeSieve[cp[number]]) {
                primeCounters[number] = primeCounters[number - 1] + 1;
            } else {
                primeCounters[number] = primeCounters[number - 1];
            }
            
            if(primeSieve[number]) {
                for(int multiple = number*number; multiple <= size; multiple += number) {
                    primeSieve[multiple] = false;
                }
            }
        }
        
        for(int[] range : ranges) {
            int ans = primeCounters[range[1]] - primeCounters[range[0] - 1];
            if(ans == 0)
                System.out.println("NONE");
            else
                System.out.println(ans);
        }
    }

    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        int testcases = Integer.parseInt(reader.readLine());
        int ranges[][] = new int[testcases][2];
        int maxNumber = 0;
        
        for(int t = 0; t < testcases; t++) {
            String range[] = reader.readLine().split(" ");    
            ranges[t][0] = Integer.parseInt(range[0]);
            ranges[t][1] = Integer.parseInt(range[1]);
            maxNumber = Math.max(maxNumber, ranges[t][1]);
        }
        
        primeCounters(ranges, maxNumber);
    }
}
#include <bits/stdc++.h>
using namespace std;

void primeCounters(vector<pair<int, int>> &ranges, int size) {
    
    vector<bool> primeSieve(size + 1, true);
    vector<int> cp(size + 1, 0);
    vector<int> primeCounter(size + 1, 0);
    
    primeSieve[0] = false;
    primeSieve[1] = false;
    
    for(int number = 2; number <= size; number++) {
        
        if(primeSieve[number]) {
            cp[number] = cp[number - 1] + 1;
        } else {
            cp[number] = cp[number - 1];
        }
        
        if(primeSieve[cp[number]]) {
            primeCounter[number] = primeCounter[number - 1] + 1;
        } else {
            primeCounter[number] = primeCounter[number - 1];
        }
        
        if(primeSieve[number]) {
            for(int multiple = number * number; multiple <= size; multiple += number) {
                primeSieve[multiple] = false;
            }
        }
    }
    for(auto range : ranges) {
        int ans = primeCounter[range.second] - primeCounter[range.first - 1];
        if(ans == 0) {
            cout << "NONE" << endl;
        } else {
            cout << ans << endl;
        }
    }
}

int main() {
	
	int testcases;
	cin >> testcases;
	vector<pair<int, int>> ranges(testcases);
	int maxNumber = 0;
	
	for(int t = 0; t < testcases; t++) {
	    int l, r;
	    cin >> l >> r;
	    ranges[t] = {l, r};
	    maxNumber = max(maxNumber, r);
	}
	
	primeCounters(ranges, maxNumber);
	
	return 0;
}
def prime_counters(ranges, size):
	
	prime_sieve = [True] * (size + 1)
	cp = [0] * (size + 1)
	prime_counters = [0] * (size + 1)

	prime_sieve[0] = False
	prime_sieve[1] = False

	for number in range(2, size + 1):
		if prime_sieve[number] is True:
			cp[number] = cp[number - 1] + 1
		else:
			cp[number] = cp[number - 1]

		if prime_sieve[cp[number]] is True:
			prime_counters[number] = prime_counters[number - 1] + 1
		else:
			prime_counters[number] = prime_counters[number - 1]

		if prime_sieve[number] is True:
			for multiple in range(number*number, size + 1, number):
				prime_sieve[multiple] = False

	for l, r in ranges:
		ans = prime_counters[r] - prime_counters[l - 1]
		if ans == 0:
			print("NONE")
		else:
			print(ans)

if __name__ == '__main__':
	
	testcases = int(input())
	ranges = []
	max_number = 0

	for t in range(testcases):
		l, r = tuple(map(int, input().split()))
		ranges.append((l, r))
		max_number = max(max_number, r)

	prime_counters(ranges, max_number)