Problem p00165 (C++) — buggy submission, verdict: Runtime Error

#include <cmath>
#include <iostream>
using namespace std;

// #define MAX 10000
#define MAX 1000000
#define INDEX 100000
// 素数配列
int h_sosu[INDEX] = {0};

//----- 列挙関数 -----//
void f_sosu();

int main(void) {
  // 素数を列挙
  f_sosu();

  // 入力変数
  int n = 0;

  while (true) {
    cin >> n;
    if (n == 0) {
      return 0;
    }

    // 答え変数(王が1払ってくれる)
    int ans = 0;
    // 当たりくじ
    int atari = 0;
    // 組
    int kumi = 0;

    // 入力
    for (int i = 0; i < n; i++) {
      cin >> atari >> kumi;
      // ループ変数
      int j = atari - kumi;
      // 終了
      int end = atari + kumi;
      // 1は政府が支払う
      bool flag_in = false;

      int count = 0;
      // 負数はいらない
      if (j < 0) {
        j = 0;
      }
      // 値が大きすぎるなら
      if (end >= MAX) {
        end = MAX;
      }
      while (h_sosu[count] < j && h_sosu[count] != 0) {
        count++;
      }
      while (h_sosu[count] <= end && h_sosu[count] != 0) {
        count++;
        ans++;
      }
      ans--;
    }

    cout << ans << endl;
  }

  return 0;
}

//*****----- 素数列挙(エラトステネスのふるい) -----*****//

void f_sosu() {
  // 2 , 3は加えておく
  register int count = 2;
  h_sosu[0] = 2, h_sosu[1] = 3;
  // 終了の値
  register int end = 0;
  // 素数flag
  register bool flag_sosu = false;

  for (int i = 5; i < MAX; i += 2) {
    // flag初期化
    flag_sosu = true;
    // 平方根までで良い
    end = sqrt((double)i);
    // カウント変数まで回す
    for (int j = 0; j < count; j++) {
      if (i % h_sosu[j] == 0) {
        flag_sosu = false;
        break;
      }
      if (h_sosu[j] > end) {
        break;
      }
    }
    // 素数なら
    if (flag_sosu == true) {
      h_sosu[count++] = i;
    }
  }
}

Error: -11

Fixed submission:

#include <cmath>
#include <iostream>
using namespace std;

// #define MAX 10000
#define MAX 999985
// 素数配列
int h_sosu[MAX + 5] = {0};

//----- 列挙関数 -----//
void f_sosu();

int main(void) {
  // 素数を列挙
  f_sosu();

  // 入力変数
  int n = 0;

  while (true) {
    cin >> n;
    if (n == 0) {
      return 0;
    }

    // 答え変数(王が1払ってくれる)
    int ans = 0;
    // 当たりくじ
    int atari = 0;
    // 組
    int kumi = 0;

    // 入力
    for (int i = 0; i < n; i++) {
      cin >> atari >> kumi;
      // ループ変数
      int j = atari - kumi;
      // 終了
      int end = atari + kumi;
      // 1は政府が支払う
      bool flag_in = false;

      int count = 0;
      // 負数はいらない
      if (j < 0) {
        j = 0;
      }
      // 値が大きすぎるなら
      if (end >= MAX) {
        end = MAX;
      }
      while (h_sosu[count] < j) {
        count++;
      }
      while (h_sosu[count] <= end) {
        count++;
        ans++;
      }
      ans--;
    }

    cout << ans << endl;
  }

  return 0;
}

//*****----- 素数列挙(エラトステネスのふるい) -----*****//

void f_sosu() {
  // 2 , 3は加えておく
  register int count = 2;
  h_sosu[0] = 2, h_sosu[1] = 3;
  // 終了の値
  register int end = 0;
  // 素数flag
  register bool flag_sosu = false;

  for (int i = 5; i < MAX; i += 2) {
    // flag初期化
    flag_sosu = true;
    // 平方根までで良い
    end = sqrt((double)i);
    // カウント変数まで回す
    for (int j = 0; j < count; j++) {
      if (i % h_sosu[j] == 0) {
        flag_sosu = false;
        break;
      }
      if (h_sosu[j] > end) {
        break;
      }
    }
    // 素数なら
    if (flag_sosu == true) {
      h_sosu[count++] = i;
    }
  }
}