Problem p00277 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)

using namespace std;

int main() {
  int N, R, L;
  while (cin >> N >> R >> L && N) {
    const int B = sqrt(N);
    vector<int> bucket((N - 1) / B + 1);
    vector<int> point(N + B, INT_MIN);
    REP(i, N) point[i] = 0;
    int last_time = 0;
    int camera_id = 0;
    vector<int> answer(N);
    for (int i = 0; i < R; i++) {
      int d, t, x;
      scanf("%d %d %d", &d, &t, &x);
      d--;
      point[d] += x;
      if (point[d] > bucket[d / B]) {
        bucket[d / B] = point[d];
      } else if (point[d] - x == bucket[d / B]) {
        bucket[d / B] = *max_element(point.begin() + (d / B) * B,
                                     point.begin() + (d / B + 1) * B);
      }
      answer[camera_id] += t - last_time;
      last_time = t;
      if (camera_id == d && x < 0) {
        int k = max_element(bucket.begin(), bucket.end()) - bucket.begin();
        camera_id =
            max_element(point.begin() + k * B, point.begin() + (k + 1) * B) -
            point.begin();
      } else if (point[d] > point[camera_id]) {
        camera_id = d;
      } else if (point[d] == point[camera_id] && d < camera_id) {
        camera_id = d;
      }
      assert(camera_id >= 0 && camera_id < N);
      // REP(i, N) cout << point[i] << " "; cout << endl;
      // REP(i, (N - 1) / B + 1) cout << bucket[i] << " "; cout << endl;
      // printf("time:%d point[%d] += %d camera: %d\\n", t, d + 1, x, camera_id +
      // 1);
    }
    answer[camera_id] += L - last_time;
    cout << max_element(answer.begin(), answer.end()) - answer.begin() + 1
         << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)

using namespace std;

int main() {
  int N, R, L;
  while (cin >> N >> R >> L && N) {
    const int B = sqrt(N);
    vector<int> bucket((N - 1) / B + 1);
    vector<int> point(N + B, INT_MIN);
    REP(i, N) point[i] = 0;
    int last_time = 0;
    int camera_id = 0;
    vector<int> answer(N);
    for (int i = 0; i < R; i++) {
      int d, t, x;
      scanf("%d %d %d", &d, &t, &x);
      d--;
      point[d] += x;
      if (point[d] > bucket[d / B]) {
        bucket[d / B] = point[d];
      } else if (point[d] - x == bucket[d / B]) {
        bucket[d / B] = *max_element(point.begin() + (d / B) * B,
                                     point.begin() + (d / B + 1) * B);
      }
      answer[camera_id] += t - last_time;
      last_time = t;
      if (camera_id == d && x < 0) {
        int k = max_element(bucket.begin(), bucket.end()) - bucket.begin();
        camera_id =
            max_element(point.begin() + k * B, point.begin() + (k + 1) * B) -
            point.begin();
      } else if (point[d] > point[camera_id]) {
        camera_id = d;
      }
      assert(camera_id >= 0 && camera_id < N);
      assert(camera_id ==
             max_element(point.begin(), point.end()) - point.begin());
      // REP(i, N) cout << point[i] << " "; cout << endl;
      // REP(i, (N - 1) / B + 1) cout << bucket[i] << " "; cout << endl;
      // printf("time:%d point[%d] += %d camera: %d\\n", t, d + 1, x, camera_id +
      // 1);
    }
    answer[camera_id] += L - last_time;
    cout << max_element(answer.begin(), answer.end()) - answer.begin() + 1
         << endl;
  }
  return 0;
}