Problem p02748 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REP2(i, n) for (int i = 1; i <= (int)(n); i++)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define SORT(x) sort(x.begin(), x.end())
#define REVE(x) reverse(x.begin(), x.end())
#define ALL(x) (x).begin(), (x).end()
#define SUM(x) accumulate(x.begin(), x.end(), 0);
#define vint(v, n)                                                             \
  vector<int> v(n);                                                            \
  REP(i, n) scanf("%lld", &v[i]);
#define vstr(v, n)                                                             \
  vector<string> v(n);                                                         \
  REP(i, n) scanf("%lld", &v[i]);
struct initon {
  initon() {
    cin.tie(0);
    ios::sync_with_stdio(false);
  };
};
bool is_prime(const unsigned n) {
  switch (n) {
  case 0: // fall-through
  case 1:
    return false;
  case 2: // fall-through
  case 3:
    return true;
  } // n > 3 が保証された

  if (n % 2 == 0 || n % 3 == 0)
    return false;
  // n は 2 と 3 のいずれの倍数でもないことが保証された
  // これより n は (6の倍数)-1 か (6の倍数)+1 である

  // 6の倍数前後の数を使って試し割りをする
  for (unsigned i = 5; i * i <= n; i += 6) {
    if (n % i == 0)
      return false; // (6の倍数)-1
    if (n % (i + 2) == 0)
      return false; // (6の倍数)+1
  }

  return true;
}
int k = 0, n = 0, m = 0, l = 0, r = 0, a = 0, b = 0, c = 0, d = 0, e = 0,
    ans = 0, ans2 = 0, x = 0, y = 0;
string s, t, S;
signed main() {
  cin >> a >> b >> m;
  vint(A, a);
  vint(B, b);
  ans = 10000000000;
  vector<vector<int>> x(m, vector<int>(3));
  REP(i, m) REP(j, 3) cin >> x[i][j];
  REP(i, m) { ans = min(ans, A[x[i][0] - 1] + B[x[i][1] - 1] - x[i][2]); }

  REP(i, a) REP(j, b) { ans = min(ans, A[i] + B[j]); }
  cout << ans;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REP2(i, n) for (int i = 1; i <= (int)(n); i++)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define SORT(x) sort(x.begin(), x.end())
#define REVE(x) reverse(x.begin(), x.end())
#define ALL(x) (x).begin(), (x).end()
#define SUM(x) accumulate(x.begin(), x.end(), 0);
#define vint(v, n)                                                             \
  vector<int> v(n);                                                            \
  REP(i, n) scanf("%lld", &v[i]);
#define vstr(v, n)                                                             \
  vector<string> v(n);                                                         \
  REP(i, n) scanf("%lld", &v[i]);
struct initon {
  initon() {
    cin.tie(0);
    ios::sync_with_stdio(false);
  };
};
bool is_prime(const unsigned n) {
  switch (n) {
  case 0: // fall-through
  case 1:
    return false;
  case 2: // fall-through
  case 3:
    return true;
  } // n > 3 が保証された

  if (n % 2 == 0 || n % 3 == 0)
    return false;
  // n は 2 と 3 のいずれの倍数でもないことが保証された
  // これより n は (6の倍数)-1 か (6の倍数)+1 である

  // 6の倍数前後の数を使って試し割りをする
  for (unsigned i = 5; i * i <= n; i += 6) {
    if (n % i == 0)
      return false; // (6の倍数)-1
    if (n % (i + 2) == 0)
      return false; // (6の倍数)+1
  }

  return true;
}
int k = 0, n = 0, m = 0, l = 0, r = 0, a = 0, b = 0, c = 0, d = 0, e = 0,
    ans = 0, ans2 = 0, x = 0, y = 0;
string s, t, S;
signed main() {
  cin >> a >> b >> m;
  vint(A, a);
  vint(B, b);
  ans = *min_element(ALL(A)) + *min_element(ALL(B));
  REP(i, m) {
    cin >> a >> b >> c;
    ans = min(ans, A[a - 1] + B[b - 1] - c);
  }
  cout << ans;
}