Problem p03003 (C++)

Buggy submission (status: Runtime Error):
/*input
20 20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
*/
#include <bits/stdc++.h>
using namespace std;
#define TEMPLATE

#ifdef TEMPLATE
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<vi> vii;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<vl> vll;
typedef vector<pi> vpi;
typedef vector<vpi> vpii;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
typedef vector<pd> vpd;
typedef vector<bool> vb;
typedef vector<vb> vbb;
typedef std::string str;
typedef std::vector<str> vs;

#define x first
#define y second
#define debug(...) cout << "[" << #__VA_ARGS__ << ": " << __VA_ARGS__ << "]\n"

const int MOD = 1000000007;
const ll INF = std::numeric_limits<ll>::max();
const int MX = 100101;
const ld PI =
    3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270L;

template <typename T>
pair<T, T> operator+(const pair<T, T> &a, const pair<T, T> &b) {
  return pair<T, T>(a.x + b.x, a.y + b.y);
}
template <typename T>
pair<T, T> operator-(const pair<T, T> &a, const pair<T, T> &b) {
  return pair<T, T>(a.x - b.x, a.y - b.y);
}
template <typename T> T operator*(const pair<T, T> &a, const pair<T, T> &b) {
  return (a.x * b.x + a.y * b.y);
}
template <typename T> T operator^(const pair<T, T> &a, const pair<T, T> &b) {
  return (a.x * b.y - a.y * b.x);
}

template <typename T> void print(vector<T> vec, string name = "") {
  cout << name;
  for (auto u : vec)
    cout << u << ' ';
  cout << '\n';
}

#endif

struct FENWICK {
  // queries [1:N]
  vector<ll> A;
  int N;
  FENWICK(int n) : N(n) { A.resize(n + 1, 0); }
  void add(int i, ll x) {
    for (; i <= N; i += (i) & (-i))
      A[i] = (x + A[i]) % MOD;
  }
  ll getQ(int i) {
    ll get = 1;
    for (; i > 0; i -= (i) & (-i))
      get = (A[i] + get) % MOD;
    return get;
  }
};

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int N, M;
  cin >> N >> M;
  vi pir(N);
  vi ant(M);
  for (int i = 0; i < N; ++i)
    cin >> pir[i];

  for (int i = 0; i < M; ++i)
    cin >> ant[i];

  FENWICK sums(M);

  for (int i = 0; i < N; ++i)
    for (int j = M - 1; j >= 0; --j)
      if (pir[i] == ant[j])
        sums.add(j + 1, sums.getQ(j));

  printf("%lld\n", sums.getQ(N));
}

/* Look for:
 * special cases (n=1?)
 * overflow (ll vs int?)
 * the exact constraints (multiple sets are too slow for n=10^6 :( )
 * array bounds
 */


Fixed submission:
/*input
20 20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
*/
#include <bits/stdc++.h>
using namespace std;
#define TEMPLATE

#ifdef TEMPLATE
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<vi> vii;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<vl> vll;
typedef vector<pi> vpi;
typedef vector<vpi> vpii;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
typedef vector<pd> vpd;
typedef vector<bool> vb;
typedef vector<vb> vbb;
typedef std::string str;
typedef std::vector<str> vs;

#define x first
#define y second
#define debug(...) cout << "[" << #__VA_ARGS__ << ": " << __VA_ARGS__ << "]\n"

const int MOD = 1000000007;
const ll INF = std::numeric_limits<ll>::max();
const int MX = 100101;
const ld PI =
    3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270L;

template <typename T>
pair<T, T> operator+(const pair<T, T> &a, const pair<T, T> &b) {
  return pair<T, T>(a.x + b.x, a.y + b.y);
}
template <typename T>
pair<T, T> operator-(const pair<T, T> &a, const pair<T, T> &b) {
  return pair<T, T>(a.x - b.x, a.y - b.y);
}
template <typename T> T operator*(const pair<T, T> &a, const pair<T, T> &b) {
  return (a.x * b.x + a.y * b.y);
}
template <typename T> T operator^(const pair<T, T> &a, const pair<T, T> &b) {
  return (a.x * b.y - a.y * b.x);
}

template <typename T> void print(vector<T> vec, string name = "") {
  cout << name;
  for (auto u : vec)
    cout << u << ' ';
  cout << '\n';
}

#endif

struct FENWICK {
  // queries [1:N]
  vector<ll> A;
  int N;
  FENWICK(int n) : N(n) { A.resize(n + 1, 0); }
  void add(int i, ll x) {
    for (; i <= N; i += (i) & (-i))
      A[i] = (x + A[i]) % MOD;
  }
  ll getQ(int i) {
    ll get = 1;
    for (; i > 0; i -= (i) & (-i))
      get = (A[i] + get) % MOD;
    return get;
  }
};

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int N, M;
  cin >> N >> M;
  vi pir(N);
  vi ant(M);
  for (int i = 0; i < N; ++i)
    cin >> pir[i];

  for (int i = 0; i < M; ++i)
    cin >> ant[i];

  FENWICK sums(M);

  for (int i = 0; i < N; ++i)
    for (int j = M - 1; j >= 0; --j)
      if (pir[i] == ant[j])
        sums.add(j + 1, sums.getQ(j));

  printf("%lld\n", sums.getQ(M));
}

/* Look for:
 * special cases (n=1?)
 * overflow (ll vs int?)
 * the exact constraints (multiple sets are too slow for n=10^6 :( )
 * array bounds
 */