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

#include <iostream>
using namespace std;

int main() {
  int n, m, i, j, k = 0; // n は太郎のカードの枚数，m は花子のカードの枚数
  int ANSn[1000]; // i,jは繰り返しに使う変数、kは答えを入れる配列のための変数
  int ANSm[1000];
  for (i = 0; i < 100; i++)
    ANSn[i] = ANSm[i] = 101;

  while (1) {
    int Sn[100] = {0}; // Snは太郎のカードの数字
    int Sm[100] = {0};
    int SUMn = 0, SUMm = 0,
        gap = 0; // SUMnは太郎のカードの数字の合計、gapは（太郎）−（二人の平均

    cin >> n >> m;
    for (i = 0; i < n; i++)
      cin >> Sn[i];
    for (i = 0; i < m; i++)
      cin >> Sm[i];

    for (i = 0; i < n; i++)
      SUMn += Sn[i];
    for (i = 0; i < m; i++)
      SUMm += Sm[i];
    if ((SUMn + SUMm) % 2 ==
        1) { // 2人の合計が奇数のときは絶対に等しくならないので答えは-1
      ANSn[k] = -1;
      ANSm[k] = -1;
    } else {
      gap = SUMn - ((SUMn + SUMm) /
                    2); // 太郎と花子でいくつ差があるカードを交換すればよいか
      for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
          if (Sn[i] - Sm[j] == gap && ANSn[k] + ANSm[k] > Sn[i] + Sm[j]) {
            ANSn[k] = Sn[i];
            ANSm[k] = Sm[j];
          }
        }
      }
      if (ANSn[k] == 101) { // 答えがなかった場合
        ANSn[k] = -1;
        ANSm[k] = -1;
      }
    }
    k++;
    if (n == 0 && m == 0)
      break;
  }

  for (i = 0; i < k - 1; i++) {
    if (ANSn[i] == -1) {
      cout << "-1" << endl;
    } else {
      cout << ANSn[i] << " " << ANSm[i] << endl;
    }
  }
}

Error: 0

Fixed submission:

#include <iostream>
using namespace std;

int main() {
  int n, m, i, j, k = 0; // n は太郎のカードの枚数，m は花子のカードの枚数
  int ANSn[1000]; // i,jは繰り返しに使う変数、kは答えを入れる配列のための変数
  int ANSm[1000];
  for (i = 0; i < 100; i++)
    ANSn[i] = ANSm[i] = 101;

  while (1) {
    int Sn[100] = {0}; // Snは太郎のカードの数字
    int Sm[100] = {0};
    int SUMn = 0, SUMm = 0,
        gap = 0; // SUMnは太郎のカードの数字の合計、gapは（太郎）−（二人の平均）
    int temp_An[100]; // temp_Anは太郎の交換するカードの答えの一つ
    int temp_Am[100];
    int xn = 0, xm = 0;
    for (i = 0; i < 100; i++)
      temp_An[i] = temp_Am[i] = -1;

    cin >> n >> m;
    for (i = 0; i < n; i++)
      cin >> Sn[i];
    for (i = 0; i < m; i++)
      cin >> Sm[i];

    for (i = 0; i < n; i++)
      SUMn += Sn[i];
    for (i = 0; i < m; i++)
      SUMm += Sm[i];
    if ((SUMn + SUMm) % 2 ==
        1) { // 2人の合計が奇数のときは絶対に等しくならないので答えは-1
      ANSn[k] = -1;
      ANSm[k] = -1;
    } else {
      gap = SUMn - ((SUMn + SUMm) /
                    2); // 太郎と花子でいくつ差があるカードを交換すればよいか
      for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
          if (Sn[i] - Sm[j] == gap) {
            temp_An[xn] = Sn[i];
            xn++;
            temp_Am[xm] = Sm[j];
            xm++;
          }
        }
      }
      if (temp_An[0] == -1) { // 答えがなかった場合
        ANSn[k] = -1;
        ANSm[k] = -1;
      } else if (temp_An[1] != -1) { // 答えが複数あった場合
        for (i = 0; i < xn; i++) {
          for (j = 0; j < xm; j++) {
            if (ANSn[k] + ANSm[k] > temp_An[i] + temp_Am[j]) {
              ANSn[k] = temp_An[i];
              ANSm[k] = temp_Am[j];
            }
          }
        }
      } else { // 答えが一つの場合
        ANSn[k] = temp_An[0];
        ANSm[k] = temp_Am[0];
      }
    }
    k++;
    if (n == 0 && m == 0)
      break;
  }

  for (i = 0; i < k - 1; i++) {
    if (ANSn[i] == -1) {
      cout << "-1" << endl;
    } else {
      cout << ANSn[i] << " " << ANSm[i] << endl;
    }
  }
}