Problem p03197 (C++)

Buggy submission (status: Runtime Error):
// 各ターンで、各色のリンゴは高々1個までしか減らせない
// リンゴの数が偶数なら、ルンルンは"あなた"が直前に食べた場合に食べるようにすることで、
// かならず最後にその種類のリンゴを食べることができる。
// リンゴの数が1より大きい奇数なら、ルンルンは"あなた"が最初に食べたあと、そのリンゴを食べないようにして、
// あなたのターンが回ってきた時にそのリンゴの数が偶数個になるようにして、あとは偶数個の場合の戦略で、
// 最後にそのリンゴを食べることができる。
// →だれが先にそのリンゴを食べるかによって戦略が変わるのか？
#include <bits/stdc++.h>
using namespace std;

int N;
int a[10];

int tesuu[310000];

// cur := 現在の手数(1,2,3,...)
void rec(int cur) {
  /*
  for (int i = 0; i < N; ++i) {
      cout << a[i] << " ";
  }
  cout << endl;
  cout << cur << endl;
  */
  bool flg = true;
  for (int i = 0; i < N; ++i) {
    if (a[i] > 0) {
      flg = false;
      break;
    }
  }
  if (flg) {
    // 結果を出力
    cout << "cur: " << cur << endl;

    for (int i = 1; i < cur; ++i) {
      if (i % 2)
        cout << "You  :";
      else
        cout << "LnLn :";
      for (int j = 0; j < N; ++j) {
        if ((tesuu[i] >> j) & 1)
          cout << 1 << " ";
        else
          cout << 0 << " ";
      }
      cout << endl;
    }
    if ((cur - 1) % 2)
      cout << "winner: You" << endl;
    else
      cout << "winner: LnLn" << endl;
    cout << endl;
    return;
  }

  for (int bits = 1; bits < (1 << N); ++bits) {
    flg = true;
    for (int i = 0; i < N; ++i) {
      if (((bits >> i) & 1) && a[i] <= 0) {
        flg = false;
        break;
      }
    }
    if (!flg)
      continue;
    for (int i = 0; i < N; ++i) {
      if ((bits >> i) & 1)
        --a[i];
    }
    tesuu[cur] = bits;
    rec(cur + 1);
    // 元に戻す
    for (int i = 0; i < N; ++i) {
      if ((bits >> i) & 1)
        ++a[i];
    }
  }
}

int main() {
  cin >> N;
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }
  // rec(1);
  for (int i = 0; i < N; ++i) {
    if (a[i] % 2) {
      cout << "first" << endl;
      return 0;
    }
  }
  cout << "second" << endl;
  return 0;
}

Fixed submission:
// 各ターンで、各色のリンゴは高々1個までしか減らせない
// リンゴの数が偶数なら、ルンルンは"あなた"が直前に食べた場合に食べるようにすることで、
// かならず最後にその種類のリンゴを食べることができる。
// リンゴの数が1より大きい奇数なら、ルンルンは"あなた"が最初に食べたあと、そのリンゴを食べないようにして、
// あなたのターンが回ってきた時にそのリンゴの数が偶数個になるようにして、あとは偶数個の場合の戦略で、
// 最後にそのリンゴを食べることができる。
// →だれが先にそのリンゴを食べるかによって戦略が変わるのか？
#include <bits/stdc++.h>
using namespace std;

int N;
int a[200000];

int tesuu[310000];

// cur := 現在の手数(1,2,3,...)
void rec(int cur) {
  /*
  for (int i = 0; i < N; ++i) {
      cout << a[i] << " ";
  }
  cout << endl;
  cout << cur << endl;
  */
  bool flg = true;
  for (int i = 0; i < N; ++i) {
    if (a[i] > 0) {
      flg = false;
      break;
    }
  }
  if (flg) {
    // 結果を出力
    cout << "cur: " << cur << endl;

    for (int i = 1; i < cur; ++i) {
      if (i % 2)
        cout << "You  :";
      else
        cout << "LnLn :";
      for (int j = 0; j < N; ++j) {
        if ((tesuu[i] >> j) & 1)
          cout << 1 << " ";
        else
          cout << 0 << " ";
      }
      cout << endl;
    }
    if ((cur - 1) % 2)
      cout << "winner: You" << endl;
    else
      cout << "winner: LnLn" << endl;
    cout << endl;
    return;
  }

  for (int bits = 1; bits < (1 << N); ++bits) {
    flg = true;
    for (int i = 0; i < N; ++i) {
      if (((bits >> i) & 1) && a[i] <= 0) {
        flg = false;
        break;
      }
    }
    if (!flg)
      continue;
    for (int i = 0; i < N; ++i) {
      if ((bits >> i) & 1)
        --a[i];
    }
    tesuu[cur] = bits;
    rec(cur + 1);
    // 元に戻す
    for (int i = 0; i < N; ++i) {
      if ((bits >> i) & 1)
        ++a[i];
    }
  }
}

int main() {
  cin >> N;
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }
  // rec(1);
  for (int i = 0; i < N; ++i) {
    if (a[i] % 2) {
      cout << "first" << endl;
      return 0;
    }
  }
  cout << "second" << endl;
  return 0;
}