Problem p03170 (C++)

Buggy submission (status: Time Limit Exceeded):
// By Tushar Gautam
#pragma GCC optimize("-O2")
#include <bits/stdc++.h>
using namespace std;
#define fastio                                                                 \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define memreset(a) memset(a, 0, sizeof(a))
#define testcase(t)                                                            \
  int t;                                                                       \
  cin >> t;                                                                    \
  while (t--)
#define forstl(i, v) for (auto &i : v)
#define forn(i, e) for (int i = 0; i < e; i++)
#define forsn(i, s, e) for (int i = s; i < e; i++)
#define rforn(i, s) for (int i = s; i >= 0; i--)
#define rforsn(i, s, e) for (int i = s; i >= e; i--)
#define leadzero(a) __builtin_clz(a)      // count leading zeroes
#define trailzero(a) __builtin_ctz(a)     // count trailing zeroes
#define bitcount(a) __builtin_popcount(a) // count set bits (add ll)
#define ln "\n"
#define dbgarr(v, s, e)                                                        \
  cerr << #v << " = ";                                                         \
  forsn(i, s, e) cerr << v[i] << ", ";                                         \
  cerr << endl
#define inputfile freopen("input.txt", "r", stdin)
#define outputfile freopen("output.txt", "w", stdout)
#define dbg(args...)                                                           \
  {                                                                            \
    string _s = #args;                                                         \
    replace(_s.begin(), _s.end(), ',', ' ');                                   \
    stringstream _ss(_s);                                                      \
    istream_iterator<string> _it(_ss);                                         \
    err(_it, args);                                                            \
  }
void err(istream_iterator<string> it) { cerr << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << "\t";
  err(++it, args...);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &c, pair<T1, T2> &v) {
  c << "(" << v.fi << "," << v.se << ")";
  return c;
}
template <template <class...> class TT, class... T>
ostream &operator<<(ostream &out, TT<T...> &c) {
  out << "{ ";
  forstl(x, c) out << x << " ";
  out << "}";
  return out;
}
typedef long long int ll;
typedef long double ld;
typedef pair<ll, ll> p64;
typedef pair<int, int> p32;
typedef pair<int, p32> p96;
typedef vector<ll> v64;
typedef vector<int> v32;
typedef vector<v32> vv32;
typedef vector<v64> vv64;
typedef vector<p32> vp32;
typedef vector<vp32> vvp32;
typedef map<int, int> m32;
const int LIM = 1e5 + 5, MOD = 1e9 + 7;
int t, n, m, k, x, y;
v32 a;
v32 dp;
int solve(int x) {
  if (x == 0)
    return 0;
  bool poss = 1;
  forstl(it, a) {
    if (x >= it)
      poss &= solve(x - it);
  }
  return dp[x] = !poss;
}
int main() {
  fastio;
  cin >> n >> k;
  a.resize(n);
  dp.assign(k + 1, -1);
  forn(i, n) { cin >> a[i]; }
  auto b = solve(k);
  if (b) {
    cout << "First\n";
  } else
    cout << "Second\n";
  return 0;
}

Fixed submission:
// By Tushar Gautam
#pragma GCC optimize("-O2")
#include <bits/stdc++.h>
using namespace std;
#define fastio                                                                 \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define memreset(a) memset(a, 0, sizeof(a))
#define testcase(t)                                                            \
  int t;                                                                       \
  cin >> t;                                                                    \
  while (t--)
#define forstl(i, v) for (auto &i : v)
#define forn(i, e) for (int i = 0; i < e; i++)
#define forsn(i, s, e) for (int i = s; i < e; i++)
#define rforn(i, s) for (int i = s; i >= 0; i--)
#define rforsn(i, s, e) for (int i = s; i >= e; i--)
#define leadzero(a) __builtin_clz(a)      // count leading zeroes
#define trailzero(a) __builtin_ctz(a)     // count trailing zeroes
#define bitcount(a) __builtin_popcount(a) // count set bits (add ll)
#define ln "\n"
#define dbgarr(v, s, e)                                                        \
  cerr << #v << " = ";                                                         \
  forsn(i, s, e) cerr << v[i] << ", ";                                         \
  cerr << endl
#define inputfile freopen("input.txt", "r", stdin)
#define outputfile freopen("output.txt", "w", stdout)
#define dbg(args...)                                                           \
  {                                                                            \
    string _s = #args;                                                         \
    replace(_s.begin(), _s.end(), ',', ' ');                                   \
    stringstream _ss(_s);                                                      \
    istream_iterator<string> _it(_ss);                                         \
    err(_it, args);                                                            \
  }
void err(istream_iterator<string> it) { cerr << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << "\t";
  err(++it, args...);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &c, pair<T1, T2> &v) {
  c << "(" << v.fi << "," << v.se << ")";
  return c;
}
template <template <class...> class TT, class... T>
ostream &operator<<(ostream &out, TT<T...> &c) {
  out << "{ ";
  forstl(x, c) out << x << " ";
  out << "}";
  return out;
}
typedef long long int ll;
typedef long double ld;
typedef pair<ll, ll> p64;
typedef pair<int, int> p32;
typedef pair<int, p32> p96;
typedef vector<ll> v64;
typedef vector<int> v32;
typedef vector<v32> vv32;
typedef vector<v64> vv64;
typedef vector<p32> vp32;
typedef vector<vp32> vvp32;
typedef map<int, int> m32;
const int LIM = 1e5 + 5, MOD = 1e9 + 7;
int t, n, m, k, x, y;
v32 a;
v32 dp;
int solve(int x) {
  if (x == 0)
    return 0;
  if (dp[x] != -1)
    return dp[x];
  bool poss = 1;
  forstl(it, a) {
    if (x >= it)
      poss &= solve(x - it);
  }
  return dp[x] = !poss;
}
int main() {
  fastio;
  cin >> n >> k;
  a.resize(n);
  dp.assign(k + 1, -1);
  forn(i, n) { cin >> a[i]; }
  auto b = solve(k);
  if (b) {
    cout << "First\n";
  } else
    cout << "Second\n";
  return 0;
}