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

#include "bits/stdc++.h"
using namespace std;

int main() {
  while (1) {
    int n, m, t, p;
    cin >> n >> m >> t >> p;
    if (n == 0)
      break;
    int kami[64][64];
    fill(kami[0], kami[64], 0);
    // 初期値を置く
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++)
        kami[i][j] = 1;
    }
    int l = 0; // 現在の左のインデックス
    int u = 0; // 現在の上のインデックス
    int oru[20][2];
    for (int i = 0; i < t; i++)
      cin >> oru[i][0] >> oru[i][1];
    int ana[20][2];
    for (int i = 0; i < p; i++)
      cin >> ana[i][0] >> ana[i][1];

    // 実際に折る
    for (int i = 0; i < t; i++) {
      // 左側に折る
      if (oru[i][0] == 1) {
        l = l + oru[i][1];
        for (int i = 0; i < l; i++) {
          for (int j = 0; j < 64; j++) {
            kami[j][l + i] += kami[j][l - i - 1];
            kami[j][l - i - 1] = 0; // 折り終わったところにはもう何もない
          }
        }
        // 横にずらす
        for (int i = l; i < 64; i++) {
          for (int j = 0; j < 64; j++) {
            kami[j][i - l] = kami[j][i];
            kami[j][i] = 0;
          }
        }
        l = 0;
      } else {
        // 下に折る（実際には上）
        u = u + oru[i][1];
        for (int i = 0; i < u; i++) {
          for (int j = 0; j < 64; j++) {
            kami[u + i][j] += kami[u - i - 1][j];
            kami[u - i - 1][j] = 0;
          }
        }
        // 縦にずらす
        for (int i = u; i < 64; i++) {
          for (int j = 0; j < 64; j++) {
            kami[i - u][j] = kami[i][j];
            kami[i][j] = 0;
          }
        }
        u = 0;
      }
      // for debug
      /*
      for(int j=0;j<m;j++)
      {
              for(int k=0;k<n;k++)
                      cout<<kami[j][k]<<" ";
              cout<<endl;
      }
      cout<<endl;
      */
    }

    // 穴を開ける
    for (int i = 0; i < p; i++)
      cout << kami[u + ana[i][1]][l + ana[i][0]] << endl;
  }
  return 0;
}


Error: 0

Fixed submission:

#include "bits/stdc++.h"
using namespace std;

int main() {
  while (1) {
    int n, m, t, p;
    cin >> n >> m >> t >> p;
    if (n == 0)
      break;
    int kami[96][96];
    fill(kami[0], kami[96], 0);
    // 初期値を置く
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++)
        kami[i][j] = 1;
    }
    int l = 0; // 現在の左のインデックス
    int u = 0; // 現在の上のインデックス
    int oru[20][2];
    for (int i = 0; i < t; i++)
      cin >> oru[i][0] >> oru[i][1];
    int ana[20][2];
    for (int i = 0; i < p; i++)
      cin >> ana[i][0] >> ana[i][1];

    // 実際に折る
    for (int i = 0; i < t; i++) {
      // 左側に折る
      if (oru[i][0] == 1) {
        l = l + oru[i][1];
        for (int i = 0; i < l; i++) {
          for (int j = 0; j < 96; j++) {
            kami[j][l + i] += kami[j][l - i - 1];
            kami[j][l - i - 1] = 0; // 折り終わったところにはもう何もない
          }
        }
      } else {
        // 下に折る（実際には上）
        u = u + oru[i][1];
        for (int i = 0; i < u; i++) {
          for (int j = 0; j < 96; j++) {
            kami[u + i][j] += kami[u - i - 1][j];
            kami[u - i - 1][j] = 0;
          }
        }
      }
      // for debug
      /*
      for(int j=0;j<m*2;j++)
      {
              for(int k=0;k<n*2;k++)
                      cout<<kami[j][k]<<" ";
              cout<<endl;
      }*/
    }

    // 穴を開ける
    for (int i = 0; i < p; i++)
      cout << kami[u + ana[i][1]][l + ana[i][0]] << endl;
  }
  return 0;
}