Problem p04037 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
#define X first
#define Y second
#define pb push_back
#define rep(X, Y) for (int(X) = 0; (X) < (Y); ++(X))
#define reps(X, S, Y) for (int(X) = S; (X) < (Y); ++(X))
#define rrep(X, Y) for (int(X) = (Y)-1; (X) >= 0; --(X))
#define repe(X, Y) for ((X) = 0; (X) < (Y); ++(X))
#define peat(X, Y) for (; (X) < (Y); ++(X))
#define all(X) (X).begin(), (X).end()
#define rall(X) (X).rbegin(), (X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)), (X).end())

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T> using vv = vector<vector<T>>;
template <class T> ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class T> inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T> inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
const ll MOD = 1e9 + 7;

int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  int n;
  cin >> n;
  vector<int> a(n);
  rep(i, n) cin >> a[i];
  sort(rall(a));
  a.pb(0);
  // cout<<a;
  int d;
  rep(i, n) {
    if (a[i] == i + 1) {
      // cout<<"yoko"<<endl;
      for (d = 0; a[i] == a[i + 1]; ++i)
        ++d;
      break;
    } else if (a[i] != a[i + 1]) {
      if (a[i + 1] == i + 1) {
        int f1 = 0, f2 = 0;
        if ((a[i] - a[i + 1]) % 2) {
          // cout<<"bokoA"<<endl;
          f1 = 1;
        }
        // cout<<"bokoB"<<i<<endl;
        for (++i; a[i] == a[i + 1]; ++i)
          ++f2;
        f2 = 1 - f2 % 2;
        // d=1;
        assert(!f1);
        d = f1 || f2;
        break;
      } else if (a[i + 1] < i + 1) {
        // cout<<"tate"<<endl;
        d = a[i] - (i + 1);
        break;
      }
    }
  }
  // cout<<d<<endl;
  cout << (d % 2 ? "First" : "Second") << endl;
  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
#define X first
#define Y second
#define pb push_back
#define rep(X, Y) for (int(X) = 0; (X) < (Y); ++(X))
#define reps(X, S, Y) for (int(X) = S; (X) < (Y); ++(X))
#define rrep(X, Y) for (int(X) = (Y)-1; (X) >= 0; --(X))
#define repe(X, Y) for ((X) = 0; (X) < (Y); ++(X))
#define peat(X, Y) for (; (X) < (Y); ++(X))
#define all(X) (X).begin(), (X).end()
#define rall(X) (X).rbegin(), (X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)), (X).end())

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T> using vv = vector<vector<T>>;
template <class T> ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class T> inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T> inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
const ll MOD = 1e9 + 7;

int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  int n;
  cin >> n;
  vector<int> a(n);
  rep(i, n) cin >> a[i];
  sort(rall(a));
  a.pb(0);
  // cout<<a;
  int d;
  rep(i, n) {
    if (a[i] == i + 1) {
      // cout<<"yoko"<<endl;
      for (d = 0; a[i] == a[i + 1]; ++i)
        ++d;
      break;
    } else if (a[i] != a[i + 1]) {
      if (a[i + 1] == i + 1) {
        int f1 = 0, f2 = 0;
        if ((a[i] - a[i + 1]) % 2) {
          // cout<<"bokoA"<<endl;
          f1 = 1;
        }
        // cout<<"bokoB"<<i<<endl;
        for (++i; a[i] == a[i + 1]; ++i)
          ++f2;
        f2 = 1 - f2 % 2;
        // d=1;
        assert(!f1 || i);
        d = f1 || f2;
        break;
      } else if (a[i + 1] < i + 1) {
        // cout<<"tate"<<endl;
        d = a[i] - (i + 1);
        break;
      }
    }
  }
  // cout<<d<<endl;
  cout << (d % 2 ? "First" : "Second") << endl;
  return 0;
}