stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

#define reg register

#define ll long long

inline ll read()

{

    ll x=0,w=0;char ch=getchar();

    while(!isdigit(ch))w|=ch=='-',ch=getchar();

    while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

    return w?-x:x;

}

bool com(ll x,ll y){return x>y;}

ll n,a[100005];

int main()

{

    n=read();

	for(reg ll i=1;i<=n;++i)

		a[i]=read();

	sort(a+1,a+1+n,com);

	for(reg ll i=1;i<=n;++i)

	{

		if(i+1>a[i+1])

		{

			ll j=i+1,an=0;

			while(a[j]==i)an++,j++;

			an%=2;

			if(an||((a[i]-i)&1))puts("First");

			else puts("Second");

			return 0;

		}

	}

}


// Faster C++ solution for the same problem (measured speedup: 5.286214462408972x):
#include <cstdio>

#include <algorithm>

#include <cctype>

using namespace std;

inline int read(int f = 1, int x = 0, char ch = ' ')

{

    while(!isdigit(ch = getchar())) if(ch == '-') f = -1;

    while(isdigit(ch)) x = x*10+ch-'0', ch = getchar();

    return f*x;

}

const int N = 2e5+5;

int n, a[N];

int main()

{

    n = read();

    for(int i = 1; i <= n; ++i) a[i] = read();

    sort(a+1, a+1+n); reverse(a+1, a+1+n);

    for(int i = 1; i <= n; ++i)

        if(i+1 > a[i+1])

        {

            int ans = 0;

            for(int j = i+1; a[j] == i; ++j) ans ^= 1;

            ans |= (a[i]-i)&1;

            puts(ans?"First":"Second");

            return 0;

        }

    return 0;

}
// Slower C++ solution:
/*======================

 * Author : ylsoi

 * Problem : AGC02E

 * Algorithm : SG

 * Time : 2018.6.2

 * ===================*/

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cmath>

#include<cstdio>

#include<climits>

using namespace std;

void File(){

    freopen("AGC02E.in","r",stdin);

    freopen("AGC02E.out","w",stdout);

}

template<typename T>bool chkmax(T &_,T __){return _<__ ? (_=__,1) : 0;}

template<typename T>bool chkmin(T &_,T __){return _>__ ? (_=__,1) : 0;}

#define REP(i,a,b) for(register int i=a;i<=b;++i)

#define DREP(i,a,b) for(register int i=a;i>=b;--i)

#define MREP(i,x) for(register int i=beg[x];i;i=E[i].last)

#define mem(a) memset(a,0,sizeof(a))

#define inf INT_MAX

const int maxn=1e5+10;

int n,a[maxn],SG[1010][1010];

bool cmp(int _,int __){return _>__;}

bool judge(int x,int y){return x<=n && y<=a[x];}    

int main(){

    scanf("%d",&n);

    REP(i,1,n)scanf("%d",&a[i]);

    sort(a+1,a+n+1,cmp);

    int px=1,py=1,step1=0,step2=0;

    while(judge(px+1,py+1))++px,++py;

    while(judge(px+step1,py))++step1;

    while(judge(px,py+step2))++step2;

    if(step1%2==0 || step2%2==0)puts("First");

    else puts("Second");

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.344123209321608x):
#include <cstdio>

#include <algorithm>

#include <cctype>

using namespace std;

inline int read(int f = 1, int x = 0, char ch = ' ')

{

    while(!isdigit(ch = getchar())) if(ch == '-') f = -1;

    while(isdigit(ch)) x = x*10+ch-'0', ch = getchar();

    return f*x;

}

const int N = 2e5+5;

int n, a[N];

int main()

{

    n = read();

    for(int i = 1; i <= n; ++i) a[i] = read();

    sort(a+1, a+1+n); reverse(a+1, a+1+n);

    for(int i = 1; i <= n; ++i)

        if(i+1 > a[i+1])

        {

            int ans = 0;

            for(int j = i+1; a[j] == i; ++j) ans ^= 1;

            ans |= (a[i]-i)&1;

            puts(ans?"First":"Second");

            return 0;

        }

    return 0;

}
// Slower C++ solution:
// https://blog.csdn.net/forever_shi/article/details/83189155 

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+10;

int n,j,ans,a[N];

int main()

{

    scanf("%d",&n);

    for (register int i=1; i<=n; ++i) scanf("%d",&a[i]);

    sort(a+1,a+n+1);

	reverse(a+1,a+n+1);	

    for (register int i=1; i<=n; ++i)

    if (i+1>a[i+1])

	{

    	j=i+1,ans=0; 

		while (a[j]==i) ans++,j++;

		if (ans%2==1 || (a[i]-i)%2==1) puts("First");

		else puts("Second");

		return 0;

    }

}

// Faster C++ solution for the same problem (measured speedup: 5.30187431208586x):
#include <cstdio>

#include <algorithm>

#include <cctype>

using namespace std;

inline int read(int f = 1, int x = 0, char ch = ' ')

{

    while(!isdigit(ch = getchar())) if(ch == '-') f = -1;

    while(isdigit(ch)) x = x*10+ch-'0', ch = getchar();

    return f*x;

}

const int N = 2e5+5;

int n, a[N];

int main()

{

    n = read();

    for(int i = 1; i <= n; ++i) a[i] = read();

    sort(a+1, a+1+n); reverse(a+1, a+1+n);

    for(int i = 1; i <= n; ++i)

        if(i+1 > a[i+1])

        {

            int ans = 0;

            for(int j = i+1; a[j] == i; ++j) ans ^= 1;

            ans |= (a[i]-i)&1;

            puts(ans?"First":"Second");

            return 0;

        }

    return 0;

}
// Slower C++ solution:
#include <iostream>

#include <cstdlib>

#include <cstring>

#include <cstdio>

#include <algorithm>



using namespace std;



const int N = 100010;



int a[N];



int main()

{	int n;

	scanf("%d", &n);

	int Max = 0;

	for (int i = 1; i <= n; i++)

		scanf("%d", &a[i]);

	sort(a + 1, a + 1 + n, greater<int>());

	int p = 1;

	while (p <= n && p <= a[p])

		p++;

	p--;

	int x = 1;

	while (p+x <= n && a[p+x] == p)

		x++;

	x--;

	if (((a[p]-p) & 1) || (x & 1))

		puts("First");

	else

		puts("Second");

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 5.218902507609995x):
#include <cstdio>

#include <algorithm>

using namespace std;

int n,a[100010];

bool cmp(int a,int b) { return a>b; }

int main()

{

	scanf("%d",&n);

	for (int i=1;i<=n;i++) scanf("%d",&a[i]);

	sort(a+1,a+n+1,cmp);

	for (int i=1,x;i<=n;i++) if (a[i+1]<i+1&&a[i]>=i)

	{

		x=0;

		while (a[i+x+1]==i) x++;

		if ((a[i]-i)%2==0&&x%2==0) printf("Second\n"); else printf("First\n");

	}

}
// Slower C++ solution:
#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

#define MAX 100100

inline int read()

{

	int x=0;bool t=false;char ch=getchar();

	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();

	if(ch=='-')t=true,ch=getchar();

	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();

	return t?-x:x;

}

int n,a[MAX],ans;

int main()

{

	n=read();

	for(int i=1;i<=n;++i)a[i]=read();

	sort(&a[1],&a[n+1]);reverse(&a[1],&a[n+1]);

	for(int i=1;i<=n;++i)

		if(i+1>a[i+1])

		{

			for(int j=i+1;a[j]==i;++j)ans^=1;

			ans|=(a[i]-i)&1;

			ans?puts("First"):puts("Second");

			return 0;

		}

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.202196243886701x):
#include <cstdio>

#include <algorithm>

using namespace std;

int n,a[100010];

bool cmp(int a,int b) { return a>b; }

int main()

{

	scanf("%d",&n);

	for (int i=1;i<=n;i++) scanf("%d",&a[i]);

	sort(a+1,a+n+1,cmp);

	for (int i=1,x;i<=n;i++) if (a[i+1]<i+1&&a[i]>=i)

	{

		x=0;

		while (a[i+x+1]==i) x++;

		if ((a[i]-i)%2==0&&x%2==0) printf("Second\n"); else printf("First\n");

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

int n,a[100010];

bool cmp(int a,int b)

{

    return a>b;

}

int main()

{

    cin>>n;

    for(int i=1;i<=n;i++)

    	cin>>a[i];

    sort(a+1,a+n+1,cmp);

    for(int i=1;i<=n;i++)

	{

        if(a[i+1]<i+1)

		{

            int ans=0;

            for(int j=i+1;;j++)

            {

                if(a[j]!=i)

                    break;

                ans^=1;

            }

				

            ans|=(a[i]-i)&1;

            if(ans)

				cout<<"First"<<endl;

            else 

				cout<<"Second"<<endl;

            return 0;

        }

    }

}

// Faster C++ solution for the same problem (measured speedup: 5.29265182170393x):
#include <cstdio>

#include <algorithm>

using namespace std;

int n,a[100010];

bool cmp(int a,int b) { return a>b; }

int main()

{

	scanf("%d",&n);

	for (int i=1;i<=n;i++) scanf("%d",&a[i]);

	sort(a+1,a+n+1,cmp);

	for (int i=1,x;i<=n;i++) if (a[i+1]<i+1&&a[i]>=i)

	{

		x=0;

		while (a[i+x+1]==i) x++;

		if ((a[i]-i)%2==0&&x%2==0) printf("Second\n"); else printf("First\n");

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

#define reg register

#define ll long long

inline ll read()

{

    ll x=0,w=0;char ch=getchar();

    while(!isdigit(ch))w|=ch=='-',ch=getchar();

    while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

    return w?-x:x;

}

bool com(ll x,ll y){return x>y;}

ll n,a[100005];

int main()

{

    n=read();

	for(reg ll i=1;i<=n;++i)

		a[i]=read();

	sort(a+1,a+1+n,com);

	for(reg ll i=1;i<=n;++i)

	{

		if(i+1>a[i+1])

		{

			ll j=i+1,an=0;

			while(a[j]==i)an++,j++;

			an%=2;

			if(an||((a[i]-i)&1))puts("First");

			else puts("Second");

			return 0;

		}

	}

}


// Faster C++ solution for the same problem (measured speedup: 5.204119532259869x):
#include <cstdio>

#include <algorithm>

using namespace std;

int n,a[100010];

bool cmp(int a,int b) { return a>b; }

int main()

{

	scanf("%d",&n);

	for (int i=1;i<=n;i++) scanf("%d",&a[i]);

	sort(a+1,a+n+1,cmp);

	for (int i=1,x;i<=n;i++) if (a[i+1]<i+1&&a[i]>=i)

	{

		x=0;

		while (a[i+x+1]==i) x++;

		if ((a[i]-i)%2==0&&x%2==0) printf("Second\n"); else printf("First\n");

	}

}
// Slower C++ solution:
/*======================

 * Author : ylsoi

 * Problem : AGC02E

 * Algorithm : SG

 * Time : 2018.6.2

 * ===================*/

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cmath>

#include<cstdio>

#include<climits>

using namespace std;

void File(){

    freopen("AGC02E.in","r",stdin);

    freopen("AGC02E.out","w",stdout);

}

template<typename T>bool chkmax(T &_,T __){return _<__ ? (_=__,1) : 0;}

template<typename T>bool chkmin(T &_,T __){return _>__ ? (_=__,1) : 0;}

#define REP(i,a,b) for(register int i=a;i<=b;++i)

#define DREP(i,a,b) for(register int i=a;i>=b;--i)

#define MREP(i,x) for(register int i=beg[x];i;i=E[i].last)

#define mem(a) memset(a,0,sizeof(a))

#define inf INT_MAX

const int maxn=1e5+10;

int n,a[maxn],SG[1010][1010];

bool cmp(int _,int __){return _>__;}

bool judge(int x,int y){return x<=n && y<=a[x];}    

int main(){

    scanf("%d",&n);

    REP(i,1,n)scanf("%d",&a[i]);

    sort(a+1,a+n+1,cmp);

    int px=1,py=1,step1=0,step2=0;

    while(judge(px+1,py+1))++px,++py;

    while(judge(px+step1,py))++step1;

    while(judge(px,py+step2))++step2;

    if(step1%2==0 || step2%2==0)puts("First");

    else puts("Second");

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.261128956118811x):
#include <cstdio>

#include <algorithm>

using namespace std;

int n,a[100010];

bool cmp(int a,int b) { return a>b; }

int main()

{

	scanf("%d",&n);

	for (int i=1;i<=n;i++) scanf("%d",&a[i]);

	sort(a+1,a+n+1,cmp);

	for (int i=1,x;i<=n;i++) if (a[i+1]<i+1&&a[i]>=i)

	{

		x=0;

		while (a[i+x+1]==i) x++;

		if ((a[i]-i)%2==0&&x%2==0) printf("Second\n"); else printf("First\n");

	}

}
// Slower C++ solution:
// https://blog.csdn.net/forever_shi/article/details/83189155 

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+10;

int n,j,ans,a[N];

int main()

{

    scanf("%d",&n);

    for (register int i=1; i<=n; ++i) scanf("%d",&a[i]);

    sort(a+1,a+n+1);

	reverse(a+1,a+n+1);	

    for (register int i=1; i<=n; ++i)

    if (i+1>a[i+1])

	{

    	j=i+1,ans=0; 

		while (a[j]==i) ans++,j++;

		if (ans%2==1 || (a[i]-i)%2==1) puts("First");

		else puts("Second");

		return 0;

    }

}

// Faster C++ solution for the same problem (measured speedup: 5.219536184413365x):
#include <cstdio>

#include <algorithm>

using namespace std;

int n,a[100010];

bool cmp(int a,int b) { return a>b; }

int main()

{

	scanf("%d",&n);

	for (int i=1;i<=n;i++) scanf("%d",&a[i]);

	sort(a+1,a+n+1,cmp);

	for (int i=1,x;i<=n;i++) if (a[i+1]<i+1&&a[i]>=i)

	{

		x=0;

		while (a[i+x+1]==i) x++;

		if ((a[i]-i)%2==0&&x%2==0) printf("Second\n"); else printf("First\n");

	}

}
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;



bool cmp(int a,int b) {

    return a>b;

}

int x[100010];



int main() {

//    freopen("in","r",stdin);

    int n;

    cin>>n;

    for(int i=1; i<=n; i++) {

        scanf("%d",&x[i]);

    }

    sort(x+1,x+1+n,cmp);

    int i;

    for(i=1; i<=n; i++) {

        if(i+1>x[i+1])break;

    }

    int sg=0;

    for(int j=1+i; x[j]==i; j++)

        sg^=1;

    sg|=(x[i]-i)&1;

    if(sg)

        cout<<"First"<<endl;

    else

        cout<<"Second"<<endl;



    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.313083226474058x):
#include<cstdio>

#include<algorithm>

using namespace std;

#define MAXN 100010

int a[MAXN],n,f;

bool cmp(int x,int y)

{

	return x>y;

}

int main()

{

	scanf("%d",&n);

	for(int i=1;i<=n;i++)

		scanf("%d",&a[i]);

	sort(a+1,a+1+n,cmp);

	for(int i=1;i<=n;i++)

		if(i+1>a[i+1])

		{

			if((a[i]-i)%2) f=1;

			bool c=0;

			for(int j=i+1;a[j]==i&&!f;j++)

				c^=1;

			if(c==1) f=1;

			break;

		}

	if(f) printf("First\n");

	else printf("Second\n");

}
// Slower C++ solution:
// In the name of God 

#include <bits/stdc++.h>



using namespace std ;





#define int long long

#define all(v) v.begin() , v.end()



template<typename T> inline bool smin(T &a, const T &b){ return b < a ? a = b,1:0;}

template<typename T> inline bool smax(T &a, const T &b){ return a < b ? a = b,1:0;}



const int N = ( int ) 1e5 + 10 ;



int n , a [ N ] ; 



int32_t main()

{

	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> n ;

	for ( int i = 1 ; i <= n ; ++i )

		cin >> a [ i ] ;

	sort ( a + 1 , a + n + 1 ) ;

	reverse ( a + 1 , a + n + 1 ) ; 

	int id = 0 ;

	for ( int j = 1 ; j <= n ; ++j )

		if ( a [ j ] >= j )

			id = j ;

	//cout << id << '\n' ; 

	int res = 0 , rem = a [ id ] - id + 1 ;

	res |= rem % 2 == 0 ;

	int found = 0 ; 

	for ( int i = id + 1 ; i <= n ; ++i ) {

		if ( a [ i ] >= id ) {

			found = i ; 

		}

	}

	//cout << rem << ' ' << found << '\n' ; 

	if ( found ) 

		res |= ( found - id + 1 ) % 2 == 0 ;

	cout << ( res ? "First" : "Second" ) << '\n' ; 

}


// Faster C++ solution for the same problem (measured speedup: 5.356680444935011x):
#include<cstdio>

#include<algorithm>

using namespace std;

#define MAXN 100010

int a[MAXN],n,f;

bool cmp(int x,int y)

{

	return x>y;

}

int main()

{

	scanf("%d",&n);

	for(int i=1;i<=n;i++)

		scanf("%d",&a[i]);

	sort(a+1,a+1+n,cmp);

	for(int i=1;i<=n;i++)

		if(i+1>a[i+1])

		{

			if((a[i]-i)%2) f=1;

			bool c=0;

			for(int j=i+1;a[j]==i&&!f;j++)

				c^=1;

			if(c==1) f=1;

			break;

		}

	if(f) printf("First\n");

	else printf("Second\n");

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std ;



const int MAXN = 1e5 + 100 ; 



int n , a[MAXN] ; 



int main()

{

	cin >> n ; 

	for(int i=1 ; i<=n ; i++)

		cin >> a[i] ;

	sort(a+1 , a+n+1) ; 

	reverse(a+1 ,a+n+1); 

	int pos = 1 ;  

	for(;pos<=n ; pos++)

		if(a[pos]<pos)

			break ; 

	pos-- ; 

//	cout << pos << endl ; 

	int pos2 = pos ; 

	for(;pos2<=n ; pos2++)

		if(a[pos2] < pos)

			break ; 

	pos2--;

//	cout << pos2 << endl ; 

	cout << ( ((pos2-pos)%2||(a[pos]-pos)%2) ? "First" : "Second" )<< endl ; 

	

}

// Faster C++ solution for the same problem (measured speedup: 5.3037950454578535x):
#include<cstdio>

#include<algorithm>

using namespace std;

#define MAXN 100010

int a[MAXN],n,f;

bool cmp(int x,int y)

{

	return x>y;

}

int main()

{

	scanf("%d",&n);

	for(int i=1;i<=n;i++)

		scanf("%d",&a[i]);

	sort(a+1,a+1+n,cmp);

	for(int i=1;i<=n;i++)

		if(i+1>a[i+1])

		{

			if((a[i]-i)%2) f=1;

			bool c=0;

			for(int j=i+1;a[j]==i&&!f;j++)

				c^=1;

			if(c==1) f=1;

			break;

		}

	if(f) printf("First\n");

	else printf("Second\n");

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define rint register int

inline int rf(){int r;int s=0,c;for(;!isdigit(c=getchar());s=c);for(r=c^48;isdigit(c=getchar());(r*=10)+=c^48);return s^45?r:-r;}

int a[100005], n; bool W(int i){bool U = (a[i+1]-i)&1, R = 0; for(rint j = i+1; j <= n && a[j]>i; R ^= 1, j++); return U&R;}

int main(){n = rf(); generate(a+1,a+n+1,rf); sort(a+1,a+n+1,greater<int>()); for(rint i = 2; i <= n+1; i++) if(a[i]<i) return puts(W(i-2)?"Second":"First"),0;}

// Faster C++ solution for the same problem (measured speedup: 5.208514682447681x):
#include<cstdio>

#include<algorithm>

using namespace std;

#define MAXN 100010

int a[MAXN],n,f;

bool cmp(int x,int y)

{

	return x>y;

}

int main()

{

	scanf("%d",&n);

	for(int i=1;i<=n;i++)

		scanf("%d",&a[i]);

	sort(a+1,a+1+n,cmp);

	for(int i=1;i<=n;i++)

		if(i+1>a[i+1])

		{

			if((a[i]-i)%2) f=1;

			bool c=0;

			for(int j=i+1;a[j]==i&&!f;j++)

				c^=1;

			if(c==1) f=1;

			break;

		}

	if(f) printf("First\n");

	else printf("Second\n");

}
// Slower C++ solution:
#include<iostream>

#include<cstdio>

#include<algorithm>

#define N 100100

using namespace std;



int n,num[N];



inline bool cmp(int u,int v)

{

	return u>v;

}



int main()

{

	int i,j;

	cin>>n;

	for(i=1;i<=n;i++)

	{

		scanf("%d",&num[i]);

	}

	sort(num+1,num+n+1,cmp);

	for(i=1;i<=n;i++)

	{

		if(i>num[i]) break;

	}

	i--;

	if((num[i]-i)&1)

	{

		puts("First");

		return 0;

	}

	for(j=i+1;num[j]==i;j++);

	j--;

	if((j-i)&1)

	{

		puts("First");

		return 0;

	}

	puts("Second");

}

// Faster C++ solution for the same problem (measured speedup: 5.285820457442694x):
#include<cstdio>

#include<algorithm>

using namespace std;

#define MAXN 100010

int a[MAXN],n,f;

bool cmp(int x,int y)

{

	return x>y;

}

int main()

{

	scanf("%d",&n);

	for(int i=1;i<=n;i++)

		scanf("%d",&a[i]);

	sort(a+1,a+1+n,cmp);

	for(int i=1;i<=n;i++)

		if(i+1>a[i+1])

		{

			if((a[i]-i)%2) f=1;

			bool c=0;

			for(int j=i+1;a[j]==i&&!f;j++)

				c^=1;

			if(c==1) f=1;

			break;

		}

	if(f) printf("First\n");

	else printf("Second\n");

}
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;



bool cmp(int a,int b) {

    return a>b;

}

int x[100010];



int main() {

//    freopen("in","r",stdin);

    int n;

    cin>>n;

    for(int i=1; i<=n; i++) {

        scanf("%d",&x[i]);

    }

    sort(x+1,x+1+n,cmp);

    int i;

    for(i=1; i<=n; i++) {

        if(i+1>x[i+1])break;

    }

    int sg=0;

    for(int j=1+i; x[j]==i; j++)

        sg^=1;

    sg|=(x[i]-i)&1;

    if(sg)

        cout<<"First"<<endl;

    else

        cout<<"Second"<<endl;



    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.391227492017744x):
#include <cstdio>

#include <algorithm>



const int MAXN = 1e5 + 5;



template<typename _T>

void read( _T &x )

{

	x = 0; char s = getchar(); int f = 1;

	while( s < '0' || '9' < s ) { f = 1; if( s == '-' ) f = -1; s = getchar(); }

	while( '0' <= s && s <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + s - '0', s = getchar(); }

	x *= f;

}



template<typename _T>

void write( _T x )

{

	if( x < 0 ) { putchar( '-' ), x = -x; }

	if( 9 < x ) write( x / 10 );

	putchar( x % 10 + '0' );

}



int a[MAXN];

int N;



bool cmp( const int &a, const int &b ) { return a > b; }



int main()

{

	read( N );

	for( int i = 1 ; i <= N ; i ++ ) read( a[i] );

	std :: sort( a + 1, a + 1 + N, cmp );

	int fir = 1;

	for( ; fir <= N && fir + 1 <= a[fir + 1] ; fir ++ );

	bool up = ( a[fir] - fir + 1 ) & 1, rig = true;

	for( int i = fir + 1 ; i <= N && a[i] >= fir ; i ++, rig ^= 1 );

	bool tag = ! ( up & rig );

	puts( tag ? "First" : "Second" );

	return 0;

}
// Slower C++ solution:
// In the name of God 

#include <bits/stdc++.h>



using namespace std ;





#define int long long

#define all(v) v.begin() , v.end()



template<typename T> inline bool smin(T &a, const T &b){ return b < a ? a = b,1:0;}

template<typename T> inline bool smax(T &a, const T &b){ return a < b ? a = b,1:0;}



const int N = ( int ) 1e5 + 10 ;



int n , a [ N ] ; 



int32_t main()

{

	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> n ;

	for ( int i = 1 ; i <= n ; ++i )

		cin >> a [ i ] ;

	sort ( a + 1 , a + n + 1 ) ;

	reverse ( a + 1 , a + n + 1 ) ; 

	int id = 0 ;

	for ( int j = 1 ; j <= n ; ++j )

		if ( a [ j ] >= j )

			id = j ;

	//cout << id << '\n' ; 

	int res = 0 , rem = a [ id ] - id + 1 ;

	res |= rem % 2 == 0 ;

	int found = 0 ; 

	for ( int i = id + 1 ; i <= n ; ++i ) {

		if ( a [ i ] >= id ) {

			found = i ; 

		}

	}

	//cout << rem << ' ' << found << '\n' ; 

	if ( found ) 

		res |= ( found - id + 1 ) % 2 == 0 ;

	cout << ( res ? "First" : "Second" ) << '\n' ; 

}


// Faster C++ solution for the same problem (measured speedup: 5.43546593375173x):
#include <cstdio>

#include <algorithm>



const int MAXN = 1e5 + 5;



template<typename _T>

void read( _T &x )

{

	x = 0; char s = getchar(); int f = 1;

	while( s < '0' || '9' < s ) { f = 1; if( s == '-' ) f = -1; s = getchar(); }

	while( '0' <= s && s <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + s - '0', s = getchar(); }

	x *= f;

}



template<typename _T>

void write( _T x )

{

	if( x < 0 ) { putchar( '-' ), x = -x; }

	if( 9 < x ) write( x / 10 );

	putchar( x % 10 + '0' );

}



int a[MAXN];

int N;



bool cmp( const int &a, const int &b ) { return a > b; }



int main()

{

	read( N );

	for( int i = 1 ; i <= N ; i ++ ) read( a[i] );

	std :: sort( a + 1, a + 1 + N, cmp );

	int fir = 1;

	for( ; fir <= N && fir + 1 <= a[fir + 1] ; fir ++ );

	bool up = ( a[fir] - fir + 1 ) & 1, rig = true;

	for( int i = fir + 1 ; i <= N && a[i] >= fir ; i ++, rig ^= 1 );

	bool tag = ! ( up & rig );

	puts( tag ? "First" : "Second" );

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std ;



const int MAXN = 1e5 + 100 ; 



int n , a[MAXN] ; 



int main()

{

	cin >> n ; 

	for(int i=1 ; i<=n ; i++)

		cin >> a[i] ;

	sort(a+1 , a+n+1) ; 

	reverse(a+1 ,a+n+1); 

	int pos = 1 ;  

	for(;pos<=n ; pos++)

		if(a[pos]<pos)

			break ; 

	pos-- ; 

//	cout << pos << endl ; 

	int pos2 = pos ; 

	for(;pos2<=n ; pos2++)

		if(a[pos2] < pos)

			break ; 

	pos2--;

//	cout << pos2 << endl ; 

	cout << ( ((pos2-pos)%2||(a[pos]-pos)%2) ? "First" : "Second" )<< endl ; 

	

}

// Faster C++ solution for the same problem (measured speedup: 5.3818027014185885x):
#include <cstdio>

#include <algorithm>



const int MAXN = 1e5 + 5;



template<typename _T>

void read( _T &x )

{

	x = 0; char s = getchar(); int f = 1;

	while( s < '0' || '9' < s ) { f = 1; if( s == '-' ) f = -1; s = getchar(); }

	while( '0' <= s && s <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + s - '0', s = getchar(); }

	x *= f;

}



template<typename _T>

void write( _T x )

{

	if( x < 0 ) { putchar( '-' ), x = -x; }

	if( 9 < x ) write( x / 10 );

	putchar( x % 10 + '0' );

}



int a[MAXN];

int N;



bool cmp( const int &a, const int &b ) { return a > b; }



int main()

{

	read( N );

	for( int i = 1 ; i <= N ; i ++ ) read( a[i] );

	std :: sort( a + 1, a + 1 + N, cmp );

	int fir = 1;

	for( ; fir <= N && fir + 1 <= a[fir + 1] ; fir ++ );

	bool up = ( a[fir] - fir + 1 ) & 1, rig = true;

	for( int i = fir + 1 ; i <= N && a[i] >= fir ; i ++, rig ^= 1 );

	bool tag = ! ( up & rig );

	puts( tag ? "First" : "Second" );

	return 0;

}