Problem p03791 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define mod 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, int>
#define ppa pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
//----------------kokomade tenpure------------
int n;
int a[10], b[10];
vector<int> ve;

int rui[100020];

signed main() {
  rui[0] = 1;
  for (int i = 1; i < 100020; i++) {
    rui[i] = rui[i - 1] * i;
    rui[i] %= mod;
  }
  cin >> n;
  // 	if(n>10) return 0;
  //   	for(int i=0;i<n;i++)ve.pb(i);

  for (int i = 0; i < n; i++)
    cin >> a[i];
  a[0] = 1;
  for (int i = 1; i < n; i++) {
    if (a[i] != a[i - 1] + 1)
      a[i] = a[i - 1] + 2;
  }
  // 	for(int i=0;i<n;i++) cout<<a[i]<<" ";
  //	cout<<endl;
  int ans = 1;
  int w;
  for (int i = 1; i < n; i++) {
    if (a[i] > a[i - 1] + 2)
      a[i] = a[i - 1] + 2;
    if (i == n - 1)
      a[i] = a[i - 1] + 1;
    if (a[i] == a[i - 1] + 2)
      continue;

    if (i == n - 1) {
      w = n - ve.size();
      //	ve.pb(n-ve.size());
      break;
    }
    //	cout<<i+1<<" "<<ve.size()<<endl;
    ve.pb(i + 1 - ve.size());

    a[i] = a[i - 1];
  }
  //	for(int i=0;i<ve.size();i++) cout<<ve[i]<<endl;
  for (int i = 0; i < ve.size(); i++) {
    ans *= ve[i];
    ans %= mod;
  }
  ans *= rui[w];
  ans %= mod;

  cout << ans << endl;

  //  	printf("%.10f\n",ans[n-1]);
  return 0;
}

Fixed submission:
#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define mod 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, int>
#define ppa pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
//----------------kokomade tenpure------------
int n;
int a[100020], b[10];
vector<int> ve;

int rui[100020];

signed main() {
  rui[0] = 1;
  for (int i = 1; i < 100020; i++) {
    rui[i] = rui[i - 1] * i;
    rui[i] %= mod;
  }
  cin >> n;
  // 	if(n>10) return 0;
  //   	for(int i=0;i<n;i++)ve.pb(i);

  for (int i = 0; i < n; i++)
    cin >> a[i];
  a[0] = 1;
  for (int i = 1; i < n; i++) {
    if (a[i] != a[i - 1] + 1)
      a[i] = a[i - 1] + 2;
  }
  // 	for(int i=0;i<n;i++) cout<<a[i]<<" ";
  //	cout<<endl;
  int ans = 1;
  int w;
  for (int i = 1; i < n; i++) {
    if (a[i] > a[i - 1] + 2)
      a[i] = a[i - 1] + 2;
    if (i == n - 1)
      a[i] = a[i - 1] + 1;
    if (a[i] == a[i - 1] + 2)
      continue;

    if (i == n - 1) {
      w = n - ve.size();
      //	ve.pb(n-ve.size());
      break;
    }
    //	cout<<i+1<<" "<<ve.size()<<endl;
    ve.pb(i + 1 - ve.size());

    a[i] = a[i - 1];
  }
  //	for(int i=0;i<ve.size();i++) cout<<ve[i]<<endl;
  for (int i = 0; i < ve.size(); i++) {
    ans *= ve[i];
    ans %= mod;
  }
  ans *= rui[w];
  ans %= mod;

  cout << ans << endl;

  //  	printf("%.10f\n",ans[n-1]);
  return 0;
}