Problem p00277 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

#define mp make_pair
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (int i = 0; i < (n); i++)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

const int INF = 1 << 29;
const double EPS = 1e-9;

const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1};
// segment-tree
int n; // nは2のべき乗
pii dat[100001 * 2 - 1];
// i番目の値(0-indexed)をxに変更
void update(int i, int x) {
  // 葉のノード番号
  int team = i;
  i += n - 1;
  dat[i].first += x;
  dat[i].second = -team;
  while (i > 0) {
    i = (i - 1) / 2;
    dat[i] = max(dat[i * 2 + 1], dat[i * 2 + 2]);
  }
}

// 初期化
void init(int _n) {
  n = 1;
  while (n < _n)
    n *= 2;
  for (int i = 0; i < _n; i++) {
    update(i, 0);
  }
}

/*
//[a,b)の最小値,l,rにはノードkに対応づく区画を与える
//外からはquery(a,b,0,0,n)のように呼ぶ
int query(int a,int b,int k,int l,int r){
        if(r <=a||b <=l)//交差しない
                return INT_MAX;
        if(a <=l&&r<=b)//完全に含む
                return dat[k];
        else{
                int vl =query(a, b, k*2+1, l, (l+r)/2);
                int vr =query(a, b, k*2+2, (l+r)/2, r);
                return max(vl,vr);
        }
}
*/
int main() {
  int N, R, L;
  cin >> N >> R >> L;
  init(N);
  int team = 0;
  int pret = 0;
  int sum[110000];
  for (int i = 0; i < R; i++) {
    int d, t, x;
    cin >> d >> t >> x;
    d--;
    update(d, x);
    sum[team] += t - pret;
    pret = t;
    team = -dat[0].second;
  }
  sum[team] += L - pret;
  int ans = 0;
  for (int i = 0; i < N; i++) {
    if (sum[ans] < sum[i]) {
      ans = i;
    }
  }
  cout << ans + 1 << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

#define mp make_pair
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (int i = 0; i < (n); i++)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef vector<bool> vb;
typedef vector<int> vi;
typedef vector<vb> vvb;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

const int INF = 1 << 29;
const double EPS = 1e-9;

const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1};
// segment-tree
int n; // nは2のべき乗
pii dat[1000000 * 2 - 1];
// i番目の値(0-indexed)をxに変更
void update(int i, int x) {
  // 葉のノード番号
  int team = i;
  i += n - 1;
  dat[i].first += x;
  dat[i].second = -team;
  while (i > 0) {
    i = (i - 1) / 2;
    dat[i] = max(dat[i * 2 + 1], dat[i * 2 + 2]);
  }
}

// 初期化
void init(int _n) {
  n = 1;
  while (n < _n)
    n *= 2;
  for (int i = 0; i < _n; i++) {
    update(i, 0);
  }
}

/*
//[a,b)の最小値,l,rにはノードkに対応づく区画を与える
//外からはquery(a,b,0,0,n)のように呼ぶ
int query(int a,int b,int k,int l,int r){
        if(r <=a||b <=l)//交差しない
                return INT_MAX;
        if(a <=l&&r<=b)//完全に含む
                return dat[k];
        else{
                int vl =query(a, b, k*2+1, l, (l+r)/2);
                int vr =query(a, b, k*2+2, (l+r)/2, r);
                return max(vl,vr);
        }
}
*/
int main() {
  int N, R, L;
  cin >> N >> R >> L;
  init(N);
  int team = 0;
  int pret = 0;
  int sum[110000];
  for (int i = 0; i < R; i++) {
    int d, t, x;
    cin >> d >> t >> x;
    d--;
    update(d, x);
    sum[team] += t - pret;
    pret = t;
    team = -dat[0].second;
  }
  sum[team] += L - pret;
  int ans = 0;
  for (int i = 0; i < N; i++) {
    if (sum[ans] < sum[i]) {
      ans = i;
    }
  }
  cout << ans + 1 << endl;
  return 0;
}