Since 2 days I'm struggling with PRIME1 problem from SPOJ. I managed to write a program that works fine for large numbers, but I can't figure out why does it display such messed numbers in the beginning range (usually 1-11). I'm using Segmented Sieve of Eratosthenes. SPOJ link
Here's the problem:
Input
The input begins with the number t of test cases in a single line (t<=10). In each of the next t lines there are two numbers m and n (1 <= m <= n <= 1000000000, n-m<=100000) separated by a space.
Output
For every test case print all prime numbers p such that m <= p <= n, one number per line, test cases separated by an empty line.
And my code:
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000000000
#define MAX_SQRT sqrt(MAX)
vector<bool> is_prime(MAX_SQRT, true);
void simpleSieve(int limit, vector<int>& primes)
{
for(int p=2; p*p<=limit; p++) {
if(is_prime[p] == true) {
for(int i=p*p; i<=limit; i+=p)
is_prime[i] = false;
}
}
for(int i=2; i<=limit; i++) {
if(is_prime[i]) primes.push_back(i);
}
}
void segmentedSieve(int left, int right)
{
int range = floor(sqrt(right)) + 1;
vector<int> primes;
simpleSieve(range, primes);
int n = right - left + 1;
bool sieve[n];
memset(sieve, true, sizeof(sieve));
for (int i = 0; i<primes.size(); i++) {
int low = floor(left/primes[i]) * primes[i];
if(low < left)
low += primes[i];
for(int a=low; a<=right; a+=primes[i]) {
sieve[a - left] = false;
}
}
for(int i=left; i<=right; i++)
if(sieve[i - left]) cout << i << "\n";
}
int main()
{
int t;
cin >> t;
while(t--) {
int left, right;
cin >> left >> right;
segmentedSieve(left, right);
}
return 0;
}
I've tried hardcoding the beginning part, but it varies, depending on the input.