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

#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <utility>
#include <vector>

#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
using namespace std;
typedef pair<int, int> P;
typedef long long int ll;
typedef pair<ll, ll> LLP;
#define INF 1000000007
#define MOD 1000000007

#define MAX_N 1005
#define MAX_M 10005

int tm[MAX_M][MAX_N]; // tm[人数][時間]

int main() {

  int n, m;
  while (cin >> n >> m, n) { // PC数、学生数

    REP(i, MAX_M) {
      REP(j, MAX_N) { tm[i][j] = 0; }
    }
    int r, t, pc, num, s, q;
    cin >> r;
    REP(i, r) {
      cin >> t >> pc >> num >> s;
      num--;    // 配列の添え字に合わせる
      t -= 540; // 配列0スタートに合わせる
      if (s == 1) {
        // ログイン
        tm[num][t + 1]++;
      } else {
        // ログアウト
        tm[num][t + 1]--;
      }
    }

    // 累積和
    REP(i, m) {
      REP(j, MAX_N - 1) {
        tm[i][j + 1] += tm[i][j]; // imos累積和
      }
      REP(j, MAX_N) {
        if (tm[i][j] > 1) {
          tm[i][j] = 1;
        }
      }
      REP(j, MAX_N - 1) {
        tm[i][j + 1] += tm[i][j]; // 累積和
      }
    }

    cin >> q; // クエリ

    int ts, tr;
    REP(i, q) {
      cin >> ts >> tr >> num; // 時刻tsから時刻trまでのnumの利用時間
      num--;
      ts -= 540;
      tr -= 540;
      cout << tm[num][tr] - tm[num][ts] << endl;
    }
  }

  return 0;
}


Error: 0

Fixed submission:

#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <utility>
#include <vector>

#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
using namespace std;
typedef pair<int, int> P;
typedef long long int ll;
typedef pair<ll, ll> LLP;
#define INF 1000000007
#define MOD 1000000007

#define MAX_N 1005

int tm[MAX_N][MAX_N]; // tm[人数][時間]

int main() {

  int n, m;
  while (cin >> n >> m, n) { // PC数、学生数

    REP(i, MAX_N) {
      REP(j, MAX_N) { tm[i][j] = 0; }
    }
    int r, t, pc, num, s, q;
    cin >> r;
    REP(i, r) {
      cin >> t >> pc >> num >> s;
      num--;    // 配列の添え字に合わせる
      t -= 540; // 配列0スタートに合わせる
      if (s == 1) {
        // ログイン
        tm[num][t + 1]++;
      } else {
        // ログアウト
        tm[num][t + 1]--;
      }
    }

    // 累積和
    REP(i, m) {
      REP(j, MAX_N - 1) {
        tm[i][j + 1] += tm[i][j]; // imos累積和
      }
      REP(j, MAX_N) {
        if (tm[i][j] > 1) {
          tm[i][j] = 1;
        }
      }
      REP(j, MAX_N - 1) {
        tm[i][j + 1] += tm[i][j]; // 累積和
      }
    }

    cin >> q; // クエリ

    int ts, tr;
    REP(i, q) {
      cin >> ts >> tr >> num; // 時刻tsから時刻trまでのnumの利用時間
      num--;
      ts -= 540;
      tr -= 540;
      cout << tm[num][tr] - tm[num][ts] << endl;
    }
  }

  return 0;
}