Problem p03959 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
#ifndef err
#define err(...) (void)0
#endif
using namespace std;
using ll = long long;
using ull = decltype(1ull);
template <class T> int size(T &&a) { return a.size(); }
#define REP(t, a)                                                              \
  for (make_signed<decltype(a.second)>::type t = a.first, _l##t = a.second;    \
       t < _l##t; t++)
#define RREP(t, a)                                                             \
  for (make_signed<decltype(a.second)>::type t = a.second - 1,                 \
                                             _l##t = a.first;                  \
       t >= _l##t; t--)
template <class B> pair<int, B> make_pair(B b) { return {0, b}; }
#define rep(t, ...) REP(t, make_pair(__VA_ARGS__))
#define rrep(t, ...) RREP(t, make_pair(__VA_ARGS__))
#define all(a) begin(a), end(a)
#define rall(a) a.rbegin(), a.rend()

void Calc();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin.exceptions(istream::failbit | istream::badbit);
  cout << fixed << setprecision(15);
  Calc();
  cout.flush();
  return 0;
}
template <class A> void amax(A &a, A b) { a = max(a, b); }
template <class A> void amin(A &a, A b) { a = min(a, b); }
struct Scanner {
  template <class A = string> A Next() {
    A a;
    cin >> a;
    return a;
  }
  template <class A = int> vector<A> Array(int n) {
    vector<A> a(n);
    for (A &i : a)
      cin >> i;
    return a;
  }
  string Line() {
    string s;
    getline(cin, s);
    return s;
  }
  template <class A> Scanner &operator,(A &a) {
    a = Next<A>();
    return *this;
  }
  template <class A> operator A() { return Next<A>(); }
} in;

/*---------------------------------------------------------------------*/

const ll mod = (ll)1e9 + 7;
template <ll MOD> struct Mint {
  typedef const Mint &T;
  ll x = 0;
  Mint() {}
  Mint(ll a) {
    x = a % MOD;
    if (x < 0)
      x += MOD;
  }
  Mint &operator+=(T a) {
    if ((x += a.x) >= MOD)
      x -= MOD;
    return *this;
  }
  Mint &operator-=(T a) {
    if ((x += MOD - a.x) >= MOD)
      x -= MOD;
    return *this;
  }
  Mint &operator*=(T a) {
    x = x * a.x % MOD;
    return *this;
  }
  Mint &operator/=(T a) { return *this *= a.Pow(MOD - 2); }
  Mint operator+(T a) const { return Mint(*this) += a; }
  Mint operator-(T a) const { return Mint(*this) -= a; }
  Mint operator*(T a) const { return Mint(*this) *= a; }
  Mint operator/(T a) const { return Mint(*this) /= a; }
  bool operator<(T a) const { return x < a.x; }
  bool operator==(T a) const { return x == a.x; }
  Mint Pow(ll k) const {
    if (k == 0)
      return 1;
    Mint t = Pow(k / 2);
    return t *= (k & 1) ? t * *this : t;
  }
};
template <ll MOD> istream &operator>>(istream &i, Mint<MOD> &a) {
  return i >> a.x;
}
template <ll MOD> ostream &operator<<(ostream &o, const Mint<MOD> &a) {
  return o << a.x;
}
typedef Mint<mod> mint;

void Calc() {

  int n = in;
  auto t = in.Array(n);
  auto a = in.Array(n);

  mint ans = 1;
  const int INF = 1e9 - 1;

  vector<int> v(n, INF);
  bool flag = false;
  int pos = -1;
  rep(i, n) {
    if (a[i] == t[i]) {
      pos = i;
      break;
    }
  }
  assert(pos >= 0);
  err(pos, t[pos]);
  rep(i, pos, n) {
    if (t[i] <= t[pos]) {
    } else {
      cout << (0) << endl;
      return;
    }
  }
  int maxi = 0;
  rep(i, 0, pos + 1) {
    if (maxi == t[i])
      ans *= t[i];
    maxi = t[i];
    err(ans);
  }

  maxi = 0;
  rrep(i, 0, pos) {
    if (a[i] <= t[pos]) {
    } else {
      cout << (0) << endl;
      return;
    }
  }
  rrep(i, pos + 1, n) {
    if (maxi == a[i])
      ans *= a[i];
    maxi = a[i];
    err(ans);
  }

  cout << (ans) << endl;
}


Fixed submission:
#include "bits/stdc++.h"
#ifndef err
#define err(...) (void)0
#endif
using namespace std;
using ll = long long;
using ull = decltype(1ull);
template <class T> int size(T &&a) { return a.size(); }
#define REP(t, a)                                                              \
  for (make_signed<decltype(a.second)>::type t = a.first, _l##t = a.second;    \
       t < _l##t; t++)
#define RREP(t, a)                                                             \
  for (make_signed<decltype(a.second)>::type t = a.second - 1,                 \
                                             _l##t = a.first;                  \
       t >= _l##t; t--)
template <class B> pair<int, B> make_pair(B b) { return {0, b}; }
#define rep(t, ...) REP(t, make_pair(__VA_ARGS__))
#define rrep(t, ...) RREP(t, make_pair(__VA_ARGS__))
#define all(a) begin(a), end(a)
#define rall(a) a.rbegin(), a.rend()

void Calc();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin.exceptions(istream::failbit | istream::badbit);
  cout << fixed << setprecision(15);
  Calc();
  cout.flush();
  return 0;
}
template <class A> void amax(A &a, A b) { a = max(a, b); }
template <class A> void amin(A &a, A b) { a = min(a, b); }
struct Scanner {
  template <class A = string> A Next() {
    A a;
    cin >> a;
    return a;
  }
  template <class A = int> vector<A> Array(int n) {
    vector<A> a(n);
    for (A &i : a)
      cin >> i;
    return a;
  }
  string Line() {
    string s;
    getline(cin, s);
    return s;
  }
  template <class A> Scanner &operator,(A &a) {
    a = Next<A>();
    return *this;
  }
  template <class A> operator A() { return Next<A>(); }
} in;

/*---------------------------------------------------------------------*/

const ll mod = (ll)1e9 + 7;
template <ll MOD> struct Mint {
  typedef const Mint &T;
  ll x = 0;
  Mint() {}
  Mint(ll a) {
    x = a % MOD;
    if (x < 0)
      x += MOD;
  }
  Mint &operator+=(T a) {
    if ((x += a.x) >= MOD)
      x -= MOD;
    return *this;
  }
  Mint &operator-=(T a) {
    if ((x += MOD - a.x) >= MOD)
      x -= MOD;
    return *this;
  }
  Mint &operator*=(T a) {
    x = x * a.x % MOD;
    return *this;
  }
  Mint &operator/=(T a) { return *this *= a.Pow(MOD - 2); }
  Mint operator+(T a) const { return Mint(*this) += a; }
  Mint operator-(T a) const { return Mint(*this) -= a; }
  Mint operator*(T a) const { return Mint(*this) *= a; }
  Mint operator/(T a) const { return Mint(*this) /= a; }
  bool operator<(T a) const { return x < a.x; }
  bool operator==(T a) const { return x == a.x; }
  Mint Pow(ll k) const {
    if (k == 0)
      return 1;
    Mint t = Pow(k / 2);
    return t *= (k & 1) ? t * *this : t;
  }
};
template <ll MOD> istream &operator>>(istream &i, Mint<MOD> &a) {
  return i >> a.x;
}
template <ll MOD> ostream &operator<<(ostream &o, const Mint<MOD> &a) {
  return o << a.x;
}
typedef Mint<mod> mint;

void Calc() {

  int n = in;
  auto t = in.Array(n);
  auto a = in.Array(n);

  mint ans = 1;
  const int INF = 1e9 - 1;

  vector<int> v(n, INF);
  bool flag = false;
  int pos = -1;
  rep(i, n) {
    if (a[i] == t[i]) {
      pos = i;
      break;
    }
  }
  if (pos == -1) {
    cout << (0) << endl;
    return;
  }
  err(pos, t[pos]);
  rep(i, pos, n) {
    if (t[i] <= t[pos]) {
    } else {
      cout << (0) << endl;
      return;
    }
  }
  int maxi = 0;
  rep(i, 0, pos + 1) {
    if (maxi == t[i])
      ans *= t[i];
    maxi = t[i];
    err(ans);
  }

  maxi = 0;
  rrep(i, 0, pos) {
    if (a[i] <= t[pos]) {
    } else {
      cout << (0) << endl;
      return;
    }
  }
  rrep(i, pos + 1, n) {
    if (maxi == a[i])
      ans *= a[i];
    maxi = a[i];
    err(ans);
  }

  cout << (ans) << endl;
}