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

#include <algorithm>
#include <bitset>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <string.h>
#include <string>
#include <vector>

using namespace std;

// #define for(i,a,b) for (int i=(a);i<(b);++i)
typedef long long ll;
typedef pair<ll, ll> P;
#define REP(i, n) for (long long i = 0; i < (long long)(n); i++)
#define pb push_back // vectorに要素追加
#define INF (ll)1e18
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

/*
けんちょん解答参照
https://atcoder.jp/contests/abc165/submissions/12594319

*/
ll N, M, Q;
vector<ll> a, b, c, d;

ll calc(const vector<ll> &A) { // 数列Aが得る得点を計算
                               // &: 参照演算子
  // https://qiita.com/RuthTaro/items/f35c3a26779c0ca1a41a
  ll ans = 0;
  REP(i, Q) {
    if (A[b[i]] - A[a[i]] == c[i])
      ans += d[i];
  }
  return ans;
}

void dfs(vector<ll> &A, ll &ans) {
  if (A.size() == N) { // Aの長さがN→Aが完成した→点数を計算する
    ll tmp = calc(A); // Aの点数を計算
                      // REP(i,A.size()){
                      // 	printf("%lld ", A[i]);
                      // }
                      // printf(", score: %lld\\n", tmp);
    chmax(ans, tmp);  // templete: tmpがansより大きかったらans更新
    return;
  }
  // 取りうる値をAの末尾を付け足すことでdfsによる全列挙を行う
  ll ba;
  if (A.size() == 0)
    ba = 1;
  else
    ba = A.back(); // back: 末尾要素への参照を取得する
  // ba = Aの一番最後の値
  for (ll add = ba; add <= M; ++add) {
    A.pb(add);
    dfs(A, ans);
    A.pop_back(); // pop_back: 末尾要素を削除
  }
}
int main() {
  // 入力
  cin >> N >> M >> Q;
  a.resize(Q);
  b.resize(Q);
  c.resize(Q);
  d.resize(Q); // vectorのサイズを修正
  REP(i, Q) {
    ll a_tmp, b_tmp, c_tmp, d_tmp;
    cin >> a_tmp >> b_tmp >> c_tmp >> d_tmp;
    a_tmp--;
    b_tmp--;
    a[i] = a_tmp;
    b[i] = b_tmp;
    c[i] = c_tmp;
    d[i] = d_tmp;
  }
  // REP(i,Q){
  // 	printf("%lld, %lld, %lld, %lld, \\n", a[i], b[i], c[i], d[i]);
  // }

  // 解法
  ll ans = 0;
  vector<ll> A;
  dfs(A, ans); // ありうる数列Aをdfsによって全列挙する

  // 出力
  printf("%lld\\n", ans);
}


Error: -11

Fixed submission:

#include <algorithm>
#include <bitset>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <string.h>
#include <string>
#include <vector>

using namespace std;

// #define for(i,a,b) for (int i=(a);i<(b);++i)
typedef long long ll;
typedef pair<ll, ll> P;
#define REP(i, n) for (long long i = 0; i < (long long)(n); i++)
#define pb push_back // vectorに要素追加
#define INF (ll)1e18
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

/*
けんちょん解答参照
https://atcoder.jp/contests/abc165/submissions/12594319

*/
ll N, M, Q;
vector<ll> a, b, c, d;

ll calc(const vector<ll> &A) { // 数列Aが得る得点を計算
                               // &: 参照演算子
  // https://qiita.com/RuthTaro/items/f35c3a26779c0ca1a41a
  ll ans = 0;
  REP(i, Q) {
    if (A[b[i]] - A[a[i]] == c[i])
      ans += d[i];
  }
  return ans;
}

void dfs(vector<ll> &A, ll &ans) {
  if (A.size() == N) { // Aの長さがN→Aが完成した→点数を計算する
    ll tmp = calc(A); // Aの点数を計算
    chmax(ans, tmp);  // templete: tmpがansより大きかったらans更新
    return;
  }
  // 取りうる値をAの末尾を付け足すことでdfsによる全列挙を行う
  ll ba = A.back(); // back: 末尾要素への参照を取得する
                    //  ba = Aの一番最後の値
  for (ll add = ba; add <= M; ++add) {
    A.pb(add);
    dfs(A, ans);
    A.pop_back(); // pop_back: 末尾要素を削除
  }
}
int main() {
  // 入力
  cin >> N >> M >> Q;
  a.resize(Q);
  b.resize(Q);
  c.resize(Q);
  d.resize(Q); // vectorのサイズを修正
  REP(i, Q) {
    ll a_tmp, b_tmp, c_tmp, d_tmp;
    cin >> a_tmp >> b_tmp >> c_tmp >> d_tmp;
    a_tmp--;
    b_tmp--;
    a[i] = a_tmp;
    b[i] = b_tmp;
    c[i] = c_tmp;
    d[i] = d_tmp;
  }

  // 解法
  ll ans = 0;
  vector<ll> A;
  dfs(A, ans); // ありうる数列Aをdfsによって全列挙する

  // 出力
  printf("%lld\\n", ans);
}