#include #define REP(i, n) for (int i = 0; (i) < int(n); ++ (i)) #define REP3(i, m, n) for (int i = (m); (i) < int(n); ++ (i)) #define REP_R(i, n) for (int i = int(n) - 1; (i) >= 0; -- (i)) #define REP3R(i, m, n) for (int i = int(n) - 1; (i) >= int(m); -- (i)) #define ALL(x) begin(x), end(x) using namespace std; template using reversed_priority_queue = priority_queue, greater >; template inline void chmax(T & a, T const & b) { a = max(a, b); } template inline void chmin(T & a, T const & b) { a = min(a, b); } template auto vectors(X x, T a) { return vector(x, a); } template auto vectors(X x, Y y, Z z, Zs... zs) { auto cont = vectors(y, z, zs...); return vector(x, cont); } template ostream & operator << (ostream & out, vector const & xs) { REP (i, int(xs.size()) - 1) out << xs[i] << ' '; if (not xs.empty()) out << xs.back(); return out; } int main() { // input int n; cin >> n; vector a(n); REP (i, n) cin >> a[i]; // solve sort(ALL(a)); a.erase(unique(ALL(a)), a.end()); n = a.size(); vector b; for (int l = 0; l < n; ) { int r = l + 1; while (r < n and a[r] == a[r - 1] + 1) { ++ r; } b.push_back(r - l); l = r; } int max_b = *max_element(ALL(b)); vector grundy(max_b + 1); grundy[0] = 0; REP3 (i, 1, max_b + 1) { vector used; REP (l, i) { int r = i - l - 1; used.push_back(grundy[l] ^ grundy[r]); } sort(ALL(used)); int & g = grundy[i]; while (g < used.size() and g == used[g]) { ++ g; } } int answer = 0; for (int b_i : b) { answer ^= grundy[b_i]; } // output cout << (answer ? "First" : "Second") << endl; return 0; }