Problem p03764 (C++)

Buggy submission (status: Time Limit Exceeded):
#include "bits/stdc++.h"
using namespace std;
#define FOR(i, j, k) for (int(i) = (j); (i) < (int)(k); ++(i))
#define rep(i, j) FOR(i, 0, j)
#define each(x, y) for (auto &(x) : (y))
#define mp make_pair
#define mt make_tuple
#define all(x) (x).begin(), (x).end()
#define debug(x) cout << #x << ": " << (x) << endl
#define smax(x, y) (x) = max((x), (y))
#define smin(x, y) (x) = min((x), (y))
#define MEM(x, y) memset((x), (y), sizeof(x))
#define sz(x) (int)(x).size()
#define pb push_back
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;

template <int MOD> class ModInt {
public:
  ModInt() : value(0) {}
  ModInt(long long val) : value((int)(val < 0 ? MOD + val % MOD : val % MOD)) {}

  ModInt &operator+=(ModInt that) {
    value = value + that.value;
    if (value >= MOD)
      value -= MOD;
    return *this;
  }
  ModInt &operator-=(ModInt that) {
    value -= that.value;
    if (value < 0)
      value += MOD;
    return *this;
  }
  ModInt &operator*=(ModInt that) {
    value = (int)((long long)value * that.value % MOD);
    return *this;
  }
  ModInt &operator/=(ModInt that) { return *this *= that.inverse(); }
  ModInt operator+(ModInt that) const { return ModInt(*this) += that; }
  ModInt operator-(ModInt that) const { return ModInt(*this) -= that; }
  ModInt operator*(ModInt that) const { return ModInt(*this) *= that; }
  ModInt operator/(ModInt that) const { return ModInt(*this) /= that; }
  ModInt pow(long long k) const {
    if (value == 0)
      return 0;
    ModInt n = *this, res = 1;
    while (k) {
      if (k & 1)
        res *= n;
      n *= n;
      k >>= 1;
    }
    return res;
  }
  ModInt inverse() const {
    long long a = value, b = MOD, u = 1, v = 0;
    while (b) {
      long long t = a / b;
      a -= t * b;
      swap(a, b);
      u -= t * v;
      swap(u, v);
    }
    return ModInt(u);
  }
  int toi() const { return value; }

private:
  int value;
};
typedef ModInt<1000000007> mint;
ostream &operator<<(ostream &os, const mint &x) {
  os << x.toi();
  return os;
}

int n, m;

mint sum(vll &a) {
  int L = sz(a);
  mint res;
  for (int len = 1; len < L; ++len) {
    for (int l = 0; l + len < L; ++l) {
      res += a[l + len] - a[l];
    }
  }
  return res;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  vll X(n), Y(m);
  rep(i, n) cin >> X[i];
  rep(i, m) cin >> Y[i];

  mint ans = sum(X) * sum(Y);
  cout << ans << endl;
}


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
#define FOR(i, j, k) for (int(i) = (j); (i) < (int)(k); ++(i))
#define rep(i, j) FOR(i, 0, j)
#define each(x, y) for (auto &(x) : (y))
#define mp make_pair
#define mt make_tuple
#define all(x) (x).begin(), (x).end()
#define debug(x) cout << #x << ": " << (x) << endl
#define smax(x, y) (x) = max((x), (y))
#define smin(x, y) (x) = min((x), (y))
#define MEM(x, y) memset((x), (y), sizeof(x))
#define sz(x) (int)(x).size()
#define pb push_back
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;

template <int MOD> class ModInt {
public:
  ModInt() : value(0) {}
  ModInt(long long val) : value((int)(val < 0 ? MOD + val % MOD : val % MOD)) {}

  ModInt &operator+=(ModInt that) {
    value = value + that.value;
    if (value >= MOD)
      value -= MOD;
    return *this;
  }
  ModInt &operator-=(ModInt that) {
    value -= that.value;
    if (value < 0)
      value += MOD;
    return *this;
  }
  ModInt &operator*=(ModInt that) {
    value = (int)((long long)value * that.value % MOD);
    return *this;
  }
  ModInt &operator/=(ModInt that) { return *this *= that.inverse(); }
  ModInt operator+(ModInt that) const { return ModInt(*this) += that; }
  ModInt operator-(ModInt that) const { return ModInt(*this) -= that; }
  ModInt operator*(ModInt that) const { return ModInt(*this) *= that; }
  ModInt operator/(ModInt that) const { return ModInt(*this) /= that; }
  ModInt pow(long long k) const {
    if (value == 0)
      return 0;
    ModInt n = *this, res = 1;
    while (k) {
      if (k & 1)
        res *= n;
      n *= n;
      k >>= 1;
    }
    return res;
  }
  ModInt inverse() const {
    long long a = value, b = MOD, u = 1, v = 0;
    while (b) {
      long long t = a / b;
      a -= t * b;
      swap(a, b);
      u -= t * v;
      swap(u, v);
    }
    return ModInt(u);
  }
  int toi() const { return value; }

private:
  int value;
};
typedef ModInt<1000000007> mint;
ostream &operator<<(ostream &os, const mint &x) {
  os << x.toi();
  return os;
}

int n, m;

mint sum(vll &a) {
  int L = sz(a);
  mint res;
  for (int i = 0; i < L - 1; ++i) {
    // どこが左端になるか？右端になるか
    mint l = i + 1, r = L - 1 - i;
    res += l * r * (a[i + 1] - a[i]);
  }
  return res;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  vll X(n), Y(m);
  rep(i, n) cin >> X[i];
  rep(i, m) cin >> Y[i];

  mint ans = sum(X) * sum(Y);
  cout << ans << endl;
}