OK, I was able to fix the segmentation fault, but now SPOJ treats my code as wrong answer while it seems to be working fine.
here's the updated code
#include <stdio.h>
#include <math.h>
#define ROW 10
#define SIZE 100000
void tradSieve(int n, int myPrimes[]);
void segSieve(int start, int N, int myPrimes[], int primes[]);
int myPrimes[ROW][SIZE];
int primes[ROW][SIZE];
int main(void){
int t;
long int m[ROW], n[ROW];
int i, j;
fflush(stdin);
scanf("%d", &t);
if(t>10)
return 1;
for(i=0; i<t; i++){
scanf("%ld %ld", &m[i], &n[i]);
tradSieve(n[i], myPrimes[i]);
segSieve(m[i], n[i], myPrimes[i], primes[i]);
}
for(i=0; i<t; i++){
for(j=m[i]; j<n[i]; j++){
if(j>=1000)
break;
else
if(primes[i][j]==0)
printf("%d\n", j);
}
printf("\n");
}
return 0;
}
void tradSieve(int n, int *maPrimes){
int i,j;
int max = floor(sqrt((double)n));
for(i=2 ; i<=max; i++)
if(maPrimes[i]==0)
for(j=i*i;j<=n;j=j+i){
if(j<1000)
maPrimes[j]=1;
else
break;
}
maPrimes[1] = 1;
}
void segSieve(int start, int N, int* maPrimes, int *prames){
int max = floor(sqrt((double)N));
int min;
int i, j;
for(i=2; i<=max; i++)
if(maPrimes[i]==0){
if(start<10)
min = i*i;
else
min = (start/i)*i;
for(j=min; j<N; j=j+i){
if(j<1000)
prames[j] = 1;
else
break;
}
}
prames[1] = 1;
}