Problem p03170 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define _USE_MATH_DEFINES
#include <cmath>
long long MOD = 1000000007;
// vector<long long > t(4*100001);
long long binary_exp(long long a, long long b) {
  long long ans = 1;
  while (b > 0) {
    if (b & 1) {
      ans = (ans * a) % MOD;
    }
    a = (a * a) % MOD;
    b = b >> 1;
  }
  return ans;
}
// long long gcd(long long a,long long b)
// {
//   if(b>a)
//   {
//     return gcd(b,a);
//   }
//   if(b==0)
//   {
//     return a;
//   }
//   else
//   {
//     return gcd(b,a%b);
//   }
// }
class comp {
public:
  bool operator()(pair<long long, long long> a, pair<long long, long long> b) {
    if (a.first > b.first) {
      return false;
    } else if (a.first == b.first && a.second < b.second) {
      return false;
    } else {
      return true;
    }
  }
};
// void buildseg(long long  x,long long  l,long long  r,vector<long long >
// &a,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=a[l]%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     buildseg(2*x+1,l,mid,a,modi);
//     buildseg(2*x+2,mid+1,r,a,modi);
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// long long  sum(long long  x,long long  l1,long long  r1,long long  l,long
// long  r,long long  modi)
// {
//   if(l>r)
//   {
//     return 0;
//   }
//   else if(l1==l && r1==r)
//   {
//     return t[x];
//   }
//   else
//   {
//     long long  mid=(l1+r1)/2;
//     return
//     (sum(2*x+1,l1,mid,l,min(r,mid),modi)+sum(2*x+2,mid+1,r1,max(l,mid+1),r,modi))%modi;
//   }
// }
// void update(long long  x,long long  l,long long  r,long long  value,long long
// pos,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=value%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     if(mid>=pos)
//     {
//       update(2*x+1,l,mid,value,pos,modi);
//     }
//     else
//     {
//         update(2*x+2,mid+1,r,value,pos,modi);
//     }
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// void prdoubleseg(long long  n)
// {
//   for(long long  i=0;i<4*n;i++)
//   {
//     cout<<t[i]<<" ";
//   }
//   cout<<endl;
// }
// void dfs(double x,  vector<vector<double> > &adj,vector<set<double> >
// &v,double &count,vector<double> &vis)
// {
//   v[x].insert(count);
//   vis[x]=1;
//   for(auto i : adj[x])
//   {
//     if(vis[i]==0)
//     {
//       vis[i]=1;
//       dfs(i,adj,v,count,vis);
//     }
//   }
// }
void bfs(long long s, vector<vector<int>> adj, vector<int> &vis,
         vector<int> &pred) {
  queue<int> q;
  q.push(s);
  vis[s] = 1;
  while (!q.empty()) {
    long long j = q.front();
    q.pop();
    //  cout<<j<<" ";
    for (auto i : adj[j]) {
      if (vis[i] == 0) {
        q.push(i);
        pred[i] = j;
        vis[i] = 1;
      }
    }
  }
}
// long long  diff(long long  a ,long long  b,long long  c)
// {
//   long long  q=min(a,b);
//   q=min(q,c);
//   long long  w=max(a,b);
//   w=max(w,c);
//   return (w-q);
// }
map<pair<int, int>, int> mp;
vector<int> ans(100009, -1);
bool dp(vector<int> &a, int n, int k, int mini) {
  if (k < mini) {
    ans[k] = 0;
    return false;
  }
  if (ans[k] != -1) {
    return ans[k];
  }
  for (int i = 0; i < n; i++) {
    if (dp(a, n, k - a[i], mini) == false) {
      ans[k] = 1;
      return true;
    }
  }
  ans[k] = 0;
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long T;
  T = 1;
  while (T--) {
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    int mini = INT_MAX;
    for (int i = 0; i < n; i++) {
      cin >> a[i];
      mini = min(mini, a[i]);
    }
    bool w = dp(a, n, k, mini);
    if (w)
      cout << "First" << endl;
    else
      cout << "Second" << endl;
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define _USE_MATH_DEFINES
#include <cmath>
long long MOD = 1000000007;
// vector<long long > t(4*100001);
long long binary_exp(long long a, long long b) {
  long long ans = 1;
  while (b > 0) {
    if (b & 1) {
      ans = (ans * a) % MOD;
    }
    a = (a * a) % MOD;
    b = b >> 1;
  }
  return ans;
}
// long long gcd(long long a,long long b)
// {
//   if(b>a)
//   {
//     return gcd(b,a);
//   }
//   if(b==0)
//   {
//     return a;
//   }
//   else
//   {
//     return gcd(b,a%b);
//   }
// }
class comp {
public:
  bool operator()(pair<long long, long long> a, pair<long long, long long> b) {
    if (a.first > b.first) {
      return false;
    } else if (a.first == b.first && a.second < b.second) {
      return false;
    } else {
      return true;
    }
  }
};
// void buildseg(long long  x,long long  l,long long  r,vector<long long >
// &a,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=a[l]%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     buildseg(2*x+1,l,mid,a,modi);
//     buildseg(2*x+2,mid+1,r,a,modi);
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// long long  sum(long long  x,long long  l1,long long  r1,long long  l,long
// long  r,long long  modi)
// {
//   if(l>r)
//   {
//     return 0;
//   }
//   else if(l1==l && r1==r)
//   {
//     return t[x];
//   }
//   else
//   {
//     long long  mid=(l1+r1)/2;
//     return
//     (sum(2*x+1,l1,mid,l,min(r,mid),modi)+sum(2*x+2,mid+1,r1,max(l,mid+1),r,modi))%modi;
//   }
// }
// void update(long long  x,long long  l,long long  r,long long  value,long long
// pos,long long  modi)
// {
//   if(l==r)
//   {
//     t[x]=value%modi;
//   }
//   else
//   {
//     long long  mid=(l+r)/2;
//     if(mid>=pos)
//     {
//       update(2*x+1,l,mid,value,pos,modi);
//     }
//     else
//     {
//         update(2*x+2,mid+1,r,value,pos,modi);
//     }
//     t[x]=(t[2*x+1]+t[2*x+2])%modi;
//   }
// }
// void prdoubleseg(long long  n)
// {
//   for(long long  i=0;i<4*n;i++)
//   {
//     cout<<t[i]<<" ";
//   }
//   cout<<endl;
// }
// void dfs(double x,  vector<vector<double> > &adj,vector<set<double> >
// &v,double &count,vector<double> &vis)
// {
//   v[x].insert(count);
//   vis[x]=1;
//   for(auto i : adj[x])
//   {
//     if(vis[i]==0)
//     {
//       vis[i]=1;
//       dfs(i,adj,v,count,vis);
//     }
//   }
// }
void bfs(long long s, vector<vector<int>> adj, vector<int> &vis,
         vector<int> &pred) {
  queue<int> q;
  q.push(s);
  vis[s] = 1;
  while (!q.empty()) {
    long long j = q.front();
    q.pop();
    //  cout<<j<<" ";
    for (auto i : adj[j]) {
      if (vis[i] == 0) {
        q.push(i);
        pred[i] = j;
        vis[i] = 1;
      }
    }
  }
}
// long long  diff(long long  a ,long long  b,long long  c)
// {
//   long long  q=min(a,b);
//   q=min(q,c);
//   long long  w=max(a,b);
//   w=max(w,c);
//   return (w-q);
// }
map<pair<int, int>, int> mp;
vector<int> ans(100009, -1);
bool dp(vector<int> &a, int n, int k, int mini) {
  if (k < mini) {
    ans[k] = 0;
    return false;
  }
  if (ans[k] != -1) {
    return ans[k];
  }
  for (int i = 0; i < n; i++) {
    if (k - a[i] >= 0) {
      if (dp(a, n, k - a[i], mini) == false) {
        ans[k] = 1;
        return true;
      }
    }
  }
  ans[k] = 0;
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long T;
  T = 1;
  while (T--) {
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    int mini = INT_MAX;
    for (int i = 0; i < n; i++) {
      cin >> a[i];
      mini = min(mini, a[i]);
    }
    bool w = dp(a, n, k, mini);
    if (w)
      cout << "First" << endl;
    else
      cout << "Second" << endl;
  }
  return 0;
}