Problem p03471 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<int, pair<int, int>> PP;
typedef vector<int> VI;
typedef vector<long long int> VL;
static const int MOD = 1000000007;
static const int INF = 2147483647;
// static const long long INF = 9223372000000000000;
// static const long long INF = 9223372000000000000/2;
// static const int INF = 1000010000;
// int dx4[4] = {0,1,0,-1}, dy4[4] = {-1,0,1,0};
// int dx5[5] = {-1,0,0,0,1}, dy5[5] = {0,-1,0,1,0};
// int dx8[8] = {-1,0,1,1,1,0,-1,-1}, dy8[8] = {1,1,1,0,-1,-1,-1,0};
// int dx9[9] = {-1,0,1,1,1,0,-1,-1,0}, dy9[9] = {1,1,1,0,-1,-1,-1,0,0};
#define PB push_back
#define MP make_pair
#define MT make_tuple
#define FI first
#define SE second
#define NP next_permutation
#define PQ priority_queue
#define UB upper_bound
#define LB lower_bound
#define ALL(x) (x).begin(), (x).end()
#define SZ(a) int((a).size())
#define LEN(a) int((a).length())
#define MAX(a, b, c) max((a), max((b), (c)))
#define MIN(a, b, c) min((a), min((b), (c)))
#define SORT(c) sort((c).begin(), (c).end())
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, x) for (int i = 0; i < (int)(x); i++)
#define REP1(i, x) for (int i = 1; i <= (int)(x); i++)
#define RREP(i, x) for (int i = ((int)(x)-1); i >= 0; i--)
#define RREP1(i, x) for (int i = ((int)(x)); i > 0; i--)
// #define int ll
// struct edge {int to,cost;};

bool rullonz = false;

typedef tuple<int, int, int> t;
set<t> s;

void dfs(int n, int a, int b, int c) {
  t k = MT(a, b, c);
  if (s.find(k) != s.end())
    return;

  if (rullonz)
    return;
  if (a + b + c == n) {
    printf("%d %d %d\n", c, b, a);
    rullonz = true;
    return;
  }
  if (a + b + c > n) {
    if (a >= 5)
      dfs(n, a - 5, b + 1, c);
    if (a >= 10)
      dfs(n, a - 10, b, c + 1);
    if (b >= 2)
      dfs(n, a, b - 2, c + 1);
  } else {
    if (c >= 1)
      dfs(n, a + 10, b, c - 1);
    if (c >= 1)
      dfs(n, a, b + 2, c - 1);
    if (b >= 1)
      dfs(n, a + 5, b - 1, c);
  }
}

signed main() {
  int n, y;
  cin >> n >> y;
  int b = y / 5000;
  y -= b * 5000;
  int a = y / 1000;
  dfs(n, a, b, 0);
  if (!rullonz)
    puts("-1 -1 -1");
  return 0;
}


Fixed submission:
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<int, pair<int, int>> PP;
typedef vector<int> VI;
typedef vector<long long int> VL;
static const int MOD = 1000000007;
static const int INF = 2147483647;
// static const long long INF = 9223372000000000000;
// static const long long INF = 9223372000000000000/2;
// static const int INF = 1000010000;
// int dx4[4] = {0,1,0,-1}, dy4[4] = {-1,0,1,0};
// int dx5[5] = {-1,0,0,0,1}, dy5[5] = {0,-1,0,1,0};
// int dx8[8] = {-1,0,1,1,1,0,-1,-1}, dy8[8] = {1,1,1,0,-1,-1,-1,0};
// int dx9[9] = {-1,0,1,1,1,0,-1,-1,0}, dy9[9] = {1,1,1,0,-1,-1,-1,0,0};
#define PB push_back
#define MP make_pair
#define MT make_tuple
#define FI first
#define SE second
#define NP next_permutation
#define PQ priority_queue
#define UB upper_bound
#define LB lower_bound
#define ALL(x) (x).begin(), (x).end()
#define SZ(a) int((a).size())
#define LEN(a) int((a).length())
#define MAX(a, b, c) max((a), max((b), (c)))
#define MIN(a, b, c) min((a), min((b), (c)))
#define SORT(c) sort((c).begin(), (c).end())
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, x) for (int i = 0; i < (int)(x); i++)
#define REP1(i, x) for (int i = 1; i <= (int)(x); i++)
#define RREP(i, x) for (int i = ((int)(x)-1); i >= 0; i--)
#define RREP1(i, x) for (int i = ((int)(x)); i > 0; i--)
// #define int ll
// struct edge {int to,cost;};

bool rullonz = false;

typedef tuple<int, int, int> t;
set<t> s;

void dfs(int n, int a, int b, int c) {
  t k = MT(a, b, c);
  if (s.find(k) != s.end())
    return;

  if (rullonz)
    return;
  if (a + b + c == n) {
    printf("%d %d %d\n", c, b, a);
    rullonz = true;
    return;
  }
  s.insert(k);
  if (a + b + c > n) {
    if (a >= 5)
      dfs(n, a - 5, b + 1, c);
    if (a >= 10)
      dfs(n, a - 10, b, c + 1);
    if (b >= 2)
      dfs(n, a, b - 2, c + 1);
  } else {
    if (c >= 1)
      dfs(n, a + 10, b, c - 1);
    if (c >= 1)
      dfs(n, a, b + 2, c - 1);
    if (b >= 1)
      dfs(n, a + 5, b - 1, c);
  }
}

signed main() {
  int n, y;
  cin >> n >> y;
  int b = y / 5000;
  y -= b * 5000;
  int a = y / 1000;
  dfs(n, a, b, 0);
  if (!rullonz)
    puts("-1 -1 -1");
  return 0;
}