PKU 3511 Fermat's Christmas Theorem

http://poj.org/problem?id=3511
整数u,lが与えられる。[l,u]の範囲にある素数の個数と、2つの整数の和で表される素数の数を答えろというような問題。


最初にn以下の素数と2つの整数の和で表される素数をすべて列挙する。
入力がかなりいやらしく、両方とも-1になるパターン以外に負が含まれているようなのでそれを対策する。
あと、2が2つの整数の和で表される数であることに気づかずにWAったりした。

bool pr[1000001];

int npr[1000001];
int fnpr[1000001];

main(){
  pr[0]=pr[1]=true;
  for(int i=2;i<=1000000;i++){
    if(pr[i])continue;
    for(int j=2*i;j<=1000000;j+=i)pr[j]=true;
  }
  for(int i=2;i<=1000000;i++){
    npr[i]=npr[i-1]+!pr[i];
    fnpr[i]=fnpr[i-1]+!pr[i]*(i%4==1)+(i==2);
  }
  int l,u;
  while(cin>>l>>u,~l | ~u){
    cout<<l<<' '<<u<<' '<<npr[u>0?u:0]-npr[l>0?l-1:0]<<' '<<fnpr[u>0?u:0]-fnpr[l>0?l-1:0]<<endl;
  }
}