Problem:
H: パラレル H 言ったら勝ちゲーム
物語
「20 言ったら勝ちゲーム」をご存じだろうか？
二人用のゲームで 0 から始まる値に交互に 1 以上 3 以下の数を足していき、値を 20 にしたほうが勝ちというゲームだ。
このゲームには値を 4 の倍数にして相手に渡すという操作を繰り返すと、必ず勝てるという有名な必勝法がある。
しかし、このままではあまりにもつまらないため、北海道大学競技プログラミングサークルは、これを応用したゲーム「パラレル H 言ったら勝ちゲーム」を考案した。
北海道大学競技プログラミングサークル HCPC はこのゲームの世界最強 AI「パラレル H」の開発に成功した。
あなたの目的はこのパラレル H を倒すことである。
問題
この問題はインタラクティブな問題である。
3 つの整数 $N$、$K$、$H$ が与えられる。
「パラレル H 言ったら勝ちゲーム」のルールは以下の通りである。
長さ $N$ の配列 $(a_1, …, a_N)$ を用意する。はじめ、$a_i = 0$ ($1 \leq i \leq N$) である。
プレイヤーは交互に、好きな要素に好きな配分で
合計で
$1$ 以上 $K$ 以下の非負整数を足すことができる。
数列の要素を $H+1$ 以上にすることはできない。
数列の要素を新たに $H$ にすると 1 ポイント獲得する。
数列の要素が全て $H$ となったときゲームは終了である。
ゲームが終了したとき、獲得したポイントの合計が多い方が勝利となる。
あなたは、先手か後手かを選択することができる。
全てのテストケースに対して、ジャッジが用意したプログラムに勝つことができたとき、正答とみなす。
入出力形式
最初に、標準入力から $N$ と $K$ と $H$ が以下の形式で与えられる。
$N$ $K$ $H$
次に、あなたは先手か後手かを選択し、標準出力に以下の形式で出力する。
先手を選択する場合
first
後手を選択する場合
second
続いて、あなたは手番を迎える毎に、標準入力から以下の形式でゲームの情報が与えられる。
$a_1$ … $a_N$
$a_1$ … $a_N$ は、操作後の数列を表す。
ジャッジは、ゲームのルールに違反した行動をとらないことが保証される。
$a_1 = a_2 = … = a_N = H$ のとき、ゲームは終了しているので、あなたは直ちにプログラムを終了させなければならない。
続いて、あなたの手番におけるあなたの行動を、標準出力に以下の形式で出力する。
$a_1$ … $a_N$
$a_1$ … $a_N$ は、操作後の数列を表す。
あなたは、ゲームのルールに違反した行動をとってはいけない。
ゲームのルールに違反した出力を行なった場合、ジャッジ結果は不定である。
$a_1 = a_2 = … = a_N = H$ のとき、ゲームは終了しているので、ジャッジは $-1$ を以下の形式で空白区切りに $N$ 個出力する。
-1 -1 … -1
これを受け取ったら、あなたは直ちにプログラムを終了させなければならない。
標準出力を行う毎に、ストリームをフラッシュ (flush) する必要があることに注意せよ。主要な言語でのフラッシュ例を以下に示す。もちろん、これ以外の方法でフラッシュを行っても構わない。
C 言語:
#include <stdio.h>
fflush(stdout);
C++:
#include <iostream>
std::cout.flush();
Java:
System.out.flush();
Python:
sys.stdout.flush()
制約
$1 \leq N \leq 99$
$1 \leq K \leq 100$
$1 \leq H \leq 100$
$0 \leq a_i \leq H$ ($1 \leq i \leq N$)
$N$ は奇数である
入力は全て整数である
入出力例 1
標準入力
標準出力
1 3 20
second
3
4
5
8
10
12
13
16
19
20
-1
20 言ったら勝ちゲームである。
後手は、常に 4 の倍数を言うことができる。
あなたは 1 ポイント獲得し、対戦相手は 0 ポイント獲得したので、あなたの勝利である。
入出力例 2
標準入力
標準出力
3 5 10
first
0 0 0
5 0 0
10 0 0
10 5 0
10 10 0
10 10 5
10 10 10
これは不正解となる入出力例である。
あなたは 0 ポイント獲得し、対戦相手は 3 ポイント獲得したので、あなたの負けである。
なお、ジャッジプログラムはこの入力例において、このような動作になるとは限らない。

Submitted solutions:

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;


vector<int> parallelh(vector<int> aa,int k,int h){
  vector<pair<int,int>> a(0);
  int c=0,r=0,v=0,vv=0,vc=0,rt=1;
  for (int i=0;i<aa.size();i++){
    a.push_back(make_pair(aa[i],i));
    if (aa[i]!=h) {c+=aa[i];r++;}
    if (aa[i]<=h-k) {v++;vv+=aa[i];}
    if (aa[i]==h-k) vc++;
    if (aa[i]<h && aa[i]>h-k) rt=0;
  }
  if (rt==0) vc=0;
  sort(all(a));
  reverse(all(a));
  int u=k;
  if (r%2==0){
    for (int i=0;i<a.size();i++){
      if (a[i].first<h && a[i].first>=h-u){
        u-=h-a[i].first;
        a[i].first=h;
      } else if (a[i].first<h-k-1) {
        int y=min(a[i].first+u,h-k-1);
        u-=y-a[i].first;
        a[i].first=y;
      }
    }
    if (u==k){
      for (int i=0;i<a.size();i++){
        if (a[i].first==h-k-1){
          if (u>=k-1 && u>0) {a[i].first++;u--;}
        }
      }
    }
  }
  else if (k%2==1) {
    bool re=true;
    int uc=(v-1)*(h-k)+(h-k-1);
    if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
      for (int i=0;i<a.size();i++){
        if (a[i].first==h-k) {
          a[i].first++;
          break;
        }
      }
      re=false;
    }
    if (re){
      int yu=0;
      for (int i=0;i<a.size();i++){
        if (a[i].first<h && a[i].first>=h-u){
          u-=h-a[i].first;
          c-=a[i].first;
          a[i].first=h;
          r--;
          yu++;
        }
      }
      int e=(r-1)*(h-k)+(h-k-1);
      if (yu==1){
        int rr=0,cc=0;
        for (int i=0;i<a.size();i++){
          if (a[i].first<h-k){
            cc+=a[i].first;
            rr++;
          }
        }
        int ee=0;
        if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
        if (ee%(k+1)==cc%(k+1)) {
          if (u>0) a[a.size()-1].first++;
        }
      }
      if (yu==0) {
        if (e%(k+1)==c%(k+1)) {
          // int w=rand.NextInt(1, k);
          int w=1;
          // int ww=rand.NextInt(1, w);
          int ww=1;
          int www=w-ww;
          for (int i=a.size()-1;i>=0;i--){
            if (a[i].first<h){
              if (ww!=0){
                a[i].first+=ww;
                ww=0;
              }
              else if (www!=0){
                a[i].first+=www;
                www=0;
              }
            }
          }
        }
        else {
          int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
          for (int i=0;i<a.size();i++){
            if (a[i].first<h-k){
              int uu=min(w,h-k-1-a[i].first);
              w-=uu;
              a[i].first+=uu;
            }
          }
          if (w!=0){
            for (int i=0;i<a.size();i++){
              if (a[i].first==h-k-1){
                if (w>0){
                  a[i].first++;
                  w--;
                }
              }
            }
          }
        }
      }
    }
  }
  else {
    bool re=true;
    int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
    if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
      for (int i=0;i<a.size();i++){
        if (a[i].first==h-k) {
          a[i].first++;
          break;
        }
      }
      re=false;
    }
    if (re){
      int yu=0;
      for (int i=0;i<a.size();i++){
        if (a[i].first<h && a[i].first>=h-u){
          u-=h-a[i].first;
          c-=a[i].first;
          a[i].first=h;
          r--;
          yu++;
        }
      }
      int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
      if (yu==1){
        int rr=0,cc=0;
        for (int i=0;i<a.size();i++){
          if (a[i].first<h-k){
            cc+=a[i].first;
            rr++;
          }
        }
        int ee=0;
        if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
        if (ee%(k+1)==cc%(k+1)) {
          if (u>0) a[a.size()-1].first++;
        }
      }
      if (yu==0) {
        if (e%(k+1)==c%(k+1)) {
          // int w=rand.NextInt(1, k);
          int w=1;
          // int ww=rand.NextInt(1, w);
          int ww=1;
          int www=w-ww;
          for (int i=a.size()-1;i>=0;i--){
            if (a[i].first<h){
              if (ww!=0){
                a[i].first+=ww;
                ww=0;
              }
              else if (www!=0){
                a[i].first+=www;
                www=0;
              }
            }
          }
        }
        else {
          int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
          for (int i=0;i<a.size();i++){
            if (a[i].first<h-k){
              int uu=min(w,h-k-1-a[i].first);
              w-=uu;
              a[i].first+=uu;
            }
          }
          if (w!=0){
            for (int i=0;i<a.size();i++){
              if (a[i].first==h-k-1){
                if (w>0){
                  a[i].first++;
                  w--;
                }
              }
            }
          }
        }
      }
    }
  }
  vector<int> ans(a.size());
  for (int i=0;i<a.size();i++){
    ans[a[i].second]=min(h,a[i].first);
  }
  return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
    if ((n*(h-k-1)+((n-1)/2)%(k/2+1)*2)%(k+1)==0) cout << "second" << endl;
    else cout << "first" << endl;
  }
  else {
    if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
    else cout << "first" << endl;
  }
  while(true){
    vector<int> a(n);
    rep(i,n) cin >> a[i];
    bool t=true;
    rep(i,n){
      if (a[i]!=-1 && a[i]!=h) t=false; 
    }
    if (t) break;
    vector<int> b(n);
    b=parallelh(a,k,h);
    rep(i,n-1) cout << b[i] << " ";
    cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 100
memory_kb: 4220
final_rank: 5

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;


// xrand.h - An implementation of xorshift random number generator.
// See the description of class XRand for its usage.
// Version 0.2

// Copyright (c) 2013  Kazuhiro Hosaka (hos@hos.ac)
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
//    1. The origin of this software must not be misrepresented; you must not
//    claim that you wrote the original software. If you use this software
//    in a product, an acknowledgment in the product documentation would be
//    appreciated but is not required.
//
//    2. Altered source versions must be plainly marked as such, and must not be
//    misrepresented as being the original software.
//
//    3. This notice may not be removed or altered from any source
//    distribution.

#ifndef XRAND_H_
#define XRAND_H_

#include <assert.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
#include <algorithm>

#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif

#ifndef UINT64_MAX
#define UINT64_MAX (18446744073709551615ULL)
#endif

#define rand           _DO_NOT_USE_RAND_
#define srand          _DO_NOT_USE_SRAND_
#define random_shuffle _DO_NOT_USE_RANDOM_SHUFFLE_

class XRand {
  public:
    // Initializes with the given seed.
    explicit XRand(uint64_t seed = 0);
    void Reset(uint64_t seed);

    // Generates the next random number, changing the state of the generator.
    // NextULong() calls NextUInt() twice.
    uint32_t NextUInt();
    uint64_t NextULong();

    // Returns an integer, almost uniformly distributed in [0, m).
    // It must hold that m != 0.
    // Calls NextUInt() once for UInt and twice for ULong.
    uint32_t NextUInt(uint32_t m);
    uint64_t NextULong(uint64_t m);

    // Returns an integer, almost uniformly distributed in [a, b].
    // It must hold that a <= b.
    // Calls NextUInt() once for Int and twice for Long.
    int32_t NextInt(int32_t a, int32_t b);
    int64_t NextLong(int64_t a, int64_t b);

    // The unbiased version of the methods above.
    // The number of calls to NextUInt() is not deterministic.
    // The expected number of that is at most two for (U)Int and four for (U)Long.
    uint32_t NextUIntUnbiased(uint32_t m);
    uint64_t NextULongUnbiased(uint64_t m);
    int32_t NextIntUnbiased(int32_t a, int32_t b);
    int64_t NextLongUnbiased(int64_t a, int64_t b);

    // Returns a double, uniformly distributed in [0.0, 1.0).
    // Calls NextUInt() twice.
    double NextDouble();

    // Returns a double, normally distributed with expectation 0 and variance 1.
    // Calls NextUInt() four times.
    double NextGaussian();

    // Shuffles the interval [first, last).
    // Calls NextUInt() (last - first) times.
    template <typename RandomAccessIterator>
      void Shuffle(RandomAccessIterator first, RandomAccessIterator last);

  private:
    uint32_t x_, y_, z_, w_;
};

XRand::XRand(uint64_t seed) {
  Reset(seed);
}

void XRand::Reset(uint64_t seed) {
  x_ = 314159265;
  y_ = 358979323;
  z_ = 846264338 ^ (65535 * static_cast<uint32_t>(seed >> 32));
  w_ = 327950288 ^ (65535 * static_cast<uint32_t>(seed));
}

uint32_t XRand::NextUInt() {
  const uint32_t t = x_ ^ x_ << 11;
  x_ = y_;
  y_ = z_;
  z_ = w_;
  return w_ = w_ ^ w_ >> 19 ^ t ^ t >> 8;
}

uint64_t XRand::NextULong() {
  const uint64_t high = NextUInt();
  const uint64_t low = NextUInt();
  return high << 32 | low;
}

uint32_t XRand::NextUInt(uint32_t m) {
  assert(m != 0);
  return NextUInt() % m;
}

uint64_t XRand::NextULong(uint64_t m) {
  assert(m != 0);
  return NextULong() % m;
}

int32_t XRand::NextInt(int32_t a, int32_t b) {
  assert(a <= b);
  return a + NextUInt(b - a + 1);
}

int64_t XRand::NextLong(int64_t a, int64_t b) {
  assert(a <= b);
  return a + NextULong(b - a + 1);
}

uint32_t XRand::NextUIntUnbiased(uint32_t m) {
  assert(m != 0);
  if (m & (m - 1)) {
    const uint32_t limit = UINT32_MAX / m * m;
    for (; ; ) {
      const uint32_t value = NextUInt();
      if (value < limit) {
        return value % m;
      }
    }
  } else {
    return NextUInt() & (m - 1);
  }
}

uint64_t XRand::NextULongUnbiased(uint64_t m) {
  assert(m != 0);
  if (m & (m - 1)) {
    const uint64_t limit = UINT64_MAX / m * m;
    for (; ; ) {
      const uint64_t value = NextULong();
      if (value < limit) {
        return value % m;
      }
    }
  } else {
    return NextULong() & (m - 1);
  }
}

int32_t XRand::NextIntUnbiased(int32_t a, int32_t b) {
  assert(a <= b);
  return a + NextUIntUnbiased(b - a + 1);
}

int64_t XRand::NextLongUnbiased(int64_t a, int64_t b) {
  assert(a <= b);
  return a + NextULongUnbiased(b - a + 1);
}

double XRand::NextDouble() {
  static const uint64_t kNumValues = 1LL << 53;
  return static_cast<double>(NextULong() & (kNumValues - 1)) / kNumValues;
}

double XRand::NextGaussian() {
  static const double kPi = acos(-1.0);
  const double value1 = NextDouble();
  const double value2 = NextDouble();
  return sqrt(-2.0 * log1p(-value1)) * cos(2.0 * kPi * value2);
}

template <typename RandomAccessIterator>
void XRand::Shuffle(RandomAccessIterator first, RandomAccessIterator last) {
  for (RandomAccessIterator iter = first; iter != last; ++iter) {
    std::iter_swap(first + NextUInt(iter - first + 1), iter);
  }
}

#endif  // #ifndef XRAND_H_

// 乱数初期化
XRand rand(15);

vector<int> parallelh(vector<int> aa,int k,int h){
  vector<pair<int,int>> a(0);
  int c=0,r=0,v=0,vv=0,vc=0,rt=1;
  for (int i=0;i<aa.size();i++){
    a.push_back(make_pair(aa[i],i));
    if (aa[i]!=h) {c+=aa[i];r++;}
    if (aa[i]<=h-k) {v++;vv+=aa[i];}
    if (aa[i]==h-k) vc++;
    if (aa[i]<h && aa[i]>h-k) rt=0;
  }
  if (rt==0) vc=0;
  sort(all(a));
  reverse(all(a));
  int u=k;
  if (r%2==0){
    for (int i=0;i<a.size();i++){
      if (a[i].first<h && a[i].first>=h-u){
        u-=h-a[i].first;
        a[i].first=h;
      } else if (a[i].first<h-k-1) {
        int y=min(a[i].first+u,h-k-1);
        u-=y-a[i].first;
        a[i].first=y;
      }
    }
    if (u==k){
      for (int i=0;i<a.size();i++){
        if (a[i].first==h-k-1){
          if (u>=k-1 && u>0) {a[i].first++;u--;}
        }
      }
    }
  }
  else if (k%2==1) {
    bool re=true;
    int uc=(v-1)*(h-k)+(h-k-1);
    if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
      for (int i=0;i<a.size();i++){
        if (a[i].first==h-k) {
          a[i].first++;
          break;
        }
      }
      re=false;
    }
    if (re){
      int yu=0;
      for (int i=0;i<a.size();i++){
        if (a[i].first<h && a[i].first>=h-u){
          u-=h-a[i].first;
          c-=a[i].first;
          a[i].first=h;
          r--;
          yu++;
        }
      }
      int e=(r-1)*(h-k)+(h-k-1);
      if (yu==1){
        int rr=0,cc=0;
        for (int i=0;i<a.size();i++){
          if (a[i].first<h-k){
            cc+=a[i].first;
            rr++;
          }
        }
        int ee=0;
        if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
        if (ee%(k+1)==cc%(k+1)) {
          if (u>0) a[a.size()-1].first++;
        }
      }
      if (yu==0) {
        if (e%(k+1)==c%(k+1)) {
          // int w=rand.NextInt(1, k);
          int w=1;
          // int ww=rand.NextInt(1, w);
          int ww=1;
          int www=w-ww;
          for (int i=a.size()-1;i>=0;i--){
            if (a[i].first<h){
              if (ww!=0){
                a[i].first+=ww;
                ww=0;
              }
              else if (www!=0){
                a[i].first+=www;
                www=0;
              }
            }
          }
        }
        else {
          int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
          for (int i=0;i<a.size();i++){
            if (a[i].first<h-k){
              int uu=min(w,h-k-1-a[i].first);
              w-=uu;
              a[i].first+=uu;
            }
          }
          if (w!=0){
            for (int i=0;i<a.size();i++){
              if (a[i].first==h-k-1){
                if (w>0){
                  a[i].first++;
                  w--;
                }
              }
            }
          }
        }
      }
    }
  }
  else {
    bool re=true;
    int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
    if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
      for (int i=0;i<a.size();i++){
        if (a[i].first==h-k) {
          a[i].first++;
          break;
        }
      }
      re=false;
    }
    if (re){
      int yu=0;
      for (int i=0;i<a.size();i++){
        if (a[i].first<h && a[i].first>=h-u){
          u-=h-a[i].first;
          c-=a[i].first;
          a[i].first=h;
          r--;
          yu++;
        }
      }
      int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
      if (yu==1){
        int rr=0,cc=0;
        for (int i=0;i<a.size();i++){
          if (a[i].first<h-k){
            cc+=a[i].first;
            rr++;
          }
        }
        int ee=0;
        if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
        if (ee%(k+1)==cc%(k+1)) {
          if (u>0) a[a.size()-1].first++;
        }
      }
      if (yu==0) {
        if (e%(k+1)==c%(k+1)) {
          // int w=rand.NextInt(1, k);
          int w=1;
          // int ww=rand.NextInt(1, w);
          int ww=1;
          int www=w-ww;
          for (int i=a.size()-1;i>=0;i--){
            if (a[i].first<h){
              if (ww!=0){
                a[i].first+=ww;
                ww=0;
              }
              else if (www!=0){
                a[i].first+=www;
                www=0;
              }
            }
          }
        }
        else {
          int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
          for (int i=0;i<a.size();i++){
            if (a[i].first<h-k){
              int uu=min(w,h-k-1-a[i].first);
              w-=uu;
              a[i].first+=uu;
            }
          }
          if (w!=0){
            for (int i=0;i<a.size();i++){
              if (a[i].first==h-k-1){
                if (w>0){
                  a[i].first++;
                  w--;
                }
              }
            }
          }
        }
      }
    }
  }
  vector<int> ans(a.size());
  for (int i=0;i<a.size();i++){
    ans[a[i].second]=min(h,a[i].first);
  }
  return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
    if ((n*(h-k-1)+((n-1)/2)%(k/2+1)*2)%(k+1)==0) cout << "second" << endl;
    else cout << "first" << endl;
  }
  else {
    if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
    else cout << "first" << endl;
  }
  while(true){
    vector<int> a(n);
    rep(i,n) cin >> a[i];
    bool t=true;
    rep(i,n){
      if (a[i]!=-1 && a[i]!=h) t=false; 
    }
    if (t) break;
    vector<int> b(n);
    b=parallelh(a,k,h);
    rep(i,n-1) cout << b[i] << " ";
    cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 100
memory_kb: 4120
final_rank: 1

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>
#include <random>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;

vector<int> parallelh(vector<int> aa,int k,int h){
    vector<pair<int,int>> a(0);
    int c=0,r=0,v=0,vv=0,vc=0,rt=1;
    for (int i=0;i<aa.size();i++){
        a.push_back(make_pair(aa[i],i));
        if (aa[i]!=h) {c+=aa[i];r++;}
        if (aa[i]<=h-k) {v++;vv+=aa[i];}
        if (aa[i]==h-k) vc++;
        if (aa[i]<h && aa[i]>h-k) rt=0;
    }
    if (rt==0) vc=0;
    sort(all(a));
    reverse(all(a));
    int u=k;
        if (r%2==0){
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    a[i].first=h;
                } else if (a[i].first<h-k-1) {
                    int y=min(a[i].first+u,h-k-1);
                    u-=y-a[i].first;
                    a[i].first=y;
                }
            }
            if (u==k){
                for (int i=0;i<a.size();i++){
                if (a[i].first==h-k-1){
                    if (u>=k-1 && u>0) {a[i].first++;u--;}
                }
            }
            }
        }
        else if (k%2==1) {
            bool re=true;
            int uc=(v-1)*(h-k)+(h-k-1);
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=(r-1)*(h-k)+(h-k-1);
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                }
            }
        }
        }
        else {
            bool re=true;
            int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    std::random_device rand;
                    int w=(rand()%k)+1;
                    int ww=(rand()%w)+1;
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
    vector<int> ans(a.size());
    for (int i=0;i<a.size();i++){
        ans[a[i].second]=min(h,a[i].first);
    }
    return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
      cout << "first" << endl;
  }
  else {
      if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  while(true){
      vector<int> a(n);
      rep(i,n) cin >> a[i];
      bool t=true;
      rep(i,n){
          if (a[i]!=-1 && a[i]!=h) t=false; 
      }
      if (t) break;
      vector<int> b(n);
      b=parallelh(a,k,h);
      rep(i,n-1) cout << b[i] << " ";
      cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 110
memory_kb: 4124
final_rank: 4

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>
#include <random>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;

vector<int> parallelh(vector<int> aa,int k,int h){
    vector<pair<int,int>> a(0);
    int c=0,r=0,v=0,vv=0,vc=0,rt=1;
    for (int i=0;i<aa.size();i++){
        a.push_back(make_pair(aa[i],i));
        if (aa[i]!=h) {c+=aa[i];r++;}
        if (aa[i]<=h-k) {v++;vv+=aa[i];}
        if (aa[i]==h-k) vc++;
        if (aa[i]<h && aa[i]>h-k) rt=0;
    }
    if (rt==0) vc=0;
    sort(all(a));
    reverse(all(a));
    int u=k;
        if (r%2==0){
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    a[i].first=h;
                } else if (a[i].first<h-k-1) {
                    int y=min(a[i].first+u,h-k-1);
                    u-=y-a[i].first;
                    a[i].first=y;
                }
            }
            if (u==k){
                for (int i=0;i<a.size();i++){
                if (a[i].first==h-k-1){
                    if (u>=k-1 && u>0) {a[i].first++;u--;}
                }
            }
            }
        }
        else if (k%2==1) {
            bool re=true;
            int uc=(v-1)*(h-k)+(h-k-1);
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=(r-1)*(h-k)+(h-k-1);
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                }
            }
        }
        }
        else {
            bool re=true;
            int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    std::random_device rand;
                    int w=(rand()%k)+1;
                    int ww=(rand()%w)+1;
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
    vector<int> ans(a.size());
    for (int i=0;i<a.size();i++){
        ans[a[i].second]=min(h,a[i].first);
    }
    return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
      if ((n*(h-k-1)+((n-1)/2)%(k/2+1)*2)%(k+1)==0) {
          cout << "first" << endl;
          rep(i,n-1) cout << 0 << " ";
          cout << 0 << endl;
      }
      else cout << "first" << endl;
  }
  else {
      if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  while(true){
      vector<int> a(n);
      rep(i,n) cin >> a[i];
      bool t=true;
      rep(i,n){
          if (a[i]!=-1 && a[i]!=h) t=false; 
      }
      if (t) break;
      vector<int> b(n);
      b=parallelh(a,k,h);
      rep(i,n-1) cout << b[i] << " ";
      cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 120
memory_kb: 4196
final_rank: 7

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>
#include <random>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;

vector<int> parallelh(vector<int> aa,int k,int h){
    vector<pair<int,int>> a(0);
    int c=0,r=0,v=0,vv=0,vc=0,rt=1;
    for (int i=0;i<aa.size();i++){
        a.push_back(make_pair(aa[i],i));
        if (aa[i]!=h) {c+=aa[i];r++;}
        if (aa[i]<=h-k) {v++;vv+=aa[i];}
        if (aa[i]==h-k) vc++;
        if (aa[i]<h && aa[i]>h-k) rt=0;
    }
    if (rt==0) vc=0;
    sort(all(a));
    reverse(all(a));
    int u=k;
        if (r%2==0){
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    a[i].first=h;
                } else if (a[i].first<h-k-1) {
                    int y=min(a[i].first+u,h-k-1);
                    u-=y-a[i].first;
                    a[i].first=y;
                }
            }
            if (u==k){
                for (int i=0;i<a.size();i++){
                if (a[i].first==h-k-1){
                    if (u>=k-1 && u>0) {a[i].first++;u--;}
                }
            }
            }
        }
        else if (k%2==1) {
            bool re=true;
            int uc=(v-1)*(h-k)+(h-k-1);
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=(r-1)*(h-k)+(h-k-1);
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                }
            }
        }
        }
        else {
            bool re=true;
            int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    std::random_device rand;
                    int w=(rand()%k)+1;
                    int ww=(rand()%w)+1;
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
    vector<int> ans(a.size());
    for (int i=0;i<a.size();i++){
        ans[a[i].second]=min(h,a[i].first);
    }
    return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
      if ((n*(h-k-1)+((n-1)/2)%(k/2+1)*2)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  else {
      if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  while(true){
      vector<int> a(n);
      rep(i,n) cin >> a[i];
      bool t=true;
      rep(i,n){
          if (a[i]!=-1 && a[i]!=h) t=false; 
      }
      if (t) break;
      vector<int> b(n);
      b=parallelh(a,k,h);
      rep(i,n-1) cout << b[i] << " ";
      cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 110
memory_kb: 4076
final_rank: 2

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>
#include <random>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;

vector<int> parallelh(vector<int> aa,int k,int h){
    vector<pair<int,int>> a(0);
    int c=0,r=0,v=0,vv=0,vc=0,rt=1;
    for (int i=0;i<aa.size();i++){
        a.push_back(make_pair(aa[i],i));
        if (aa[i]!=h) {c+=aa[i];r++;}
        if (aa[i]<=h-k) {v++;vv+=aa[i];}
        if (aa[i]==h-k) vc++;
        if (aa[i]<h && aa[i]>h-k) rt=0;
    }
    if (rt==0) vc=0;
    sort(all(a));
    reverse(all(a));
    int u=k;
        if (r%2==0){
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    a[i].first=h;
                } else if (a[i].first<h-k-1) {
                    int y=min(a[i].first+u,h-k-1);
                    u-=y-a[i].first;
                    a[i].first=y;
                }
            }
            if (u==k){
                for (int i=0;i<a.size();i++){
                if (a[i].first==h-k-1){
                    if (u>=k-1 && u>0) {a[i].first++;u--;}
                }
            }
            }
        }
        else if (k%2==1) {
            bool re=true;
            int uc=(v-1)*(h-k)+(h-k-1);
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=(r-1)*(h-k)+(h-k-1);
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    std::random_device rand;
                    int w=(rand()%k)+1;
                    int ww=(rand()%w)+1;
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
        else {
            bool re=true;
            int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    std::random_device rand;
                    int w=(rand()%k)+1;
                    int ww=(rand()%w)+1;
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
    vector<int> ans(a.size());
    for (int i=0;i<a.size();i++){
        ans[a[i].second]=min(h,a[i].first);
    }
    return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
      if ((n*(h-k-1)+((n-1)/2)%(k/2+1)*2)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  else {
      if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  while(true){
      vector<int> a(n);
      rep(i,n) cin >> a[i];
      bool t=true;
      rep(i,n){
          if (a[i]!=-1 && a[i]!=h) t=false; 
      }
      if (t) break;
      vector<int> b(n);
      b=parallelh(a,k,h);
      rep(i,n-1) cout << b[i] << " ";
      cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 110
memory_kb: 4088
final_rank: 3

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>

using namespace std;
#define pp pair<int,int>
#define ll long long
#define rep(i,n) for(ll (i)=0;(i)<(n);(i)++)
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
ll MOD=998244353;
ll mod=998244353;
int inf=1000001000;
ll INF=1e18+5;


// xrand.h - An implementation of xorshift random number generator.
// See the description of class XRand for its usage.
// Version 0.2

// Copyright (c) 2013  Kazuhiro Hosaka (hos@hos.ac)
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
//    1. The origin of this software must not be misrepresented; you must not
//    claim that you wrote the original software. If you use this software
//    in a product, an acknowledgment in the product documentation would be
//    appreciated but is not required.
//
//    2. Altered source versions must be plainly marked as such, and must not be
//    misrepresented as being the original software.
//
//    3. This notice may not be removed or altered from any source
//    distribution.

#ifndef XRAND_H_
#define XRAND_H_

#include <assert.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
#include <algorithm>

#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif

#ifndef UINT64_MAX
#define UINT64_MAX (18446744073709551615ULL)
#endif

#define rand           _DO_NOT_USE_RAND_
#define srand          _DO_NOT_USE_SRAND_
#define random_shuffle _DO_NOT_USE_RANDOM_SHUFFLE_

class XRand {
 public:
  // Initializes with the given seed.
  explicit XRand(uint64_t seed = 0);
  void Reset(uint64_t seed);

  // Generates the next random number, changing the state of the generator.
  // NextULong() calls NextUInt() twice.
  uint32_t NextUInt();
  uint64_t NextULong();

  // Returns an integer, almost uniformly distributed in [0, m).
  // It must hold that m != 0.
  // Calls NextUInt() once for UInt and twice for ULong.
  uint32_t NextUInt(uint32_t m);
  uint64_t NextULong(uint64_t m);

  // Returns an integer, almost uniformly distributed in [a, b].
  // It must hold that a <= b.
  // Calls NextUInt() once for Int and twice for Long.
  int32_t NextInt(int32_t a, int32_t b);
  int64_t NextLong(int64_t a, int64_t b);

  // The unbiased version of the methods above.
  // The number of calls to NextUInt() is not deterministic.
  // The expected number of that is at most two for (U)Int and four for (U)Long.
  uint32_t NextUIntUnbiased(uint32_t m);
  uint64_t NextULongUnbiased(uint64_t m);
  int32_t NextIntUnbiased(int32_t a, int32_t b);
  int64_t NextLongUnbiased(int64_t a, int64_t b);

  // Returns a double, uniformly distributed in [0.0, 1.0).
  // Calls NextUInt() twice.
  double NextDouble();

  // Returns a double, normally distributed with expectation 0 and variance 1.
  // Calls NextUInt() four times.
  double NextGaussian();

  // Shuffles the interval [first, last).
  // Calls NextUInt() (last - first) times.
  template <typename RandomAccessIterator>
  void Shuffle(RandomAccessIterator first, RandomAccessIterator last);

 private:
  uint32_t x_, y_, z_, w_;
};

XRand::XRand(uint64_t seed) {
  Reset(seed);
}

void XRand::Reset(uint64_t seed) {
  x_ = 314159265;
  y_ = 358979323;
  z_ = 846264338 ^ (65535 * static_cast<uint32_t>(seed >> 32));
  w_ = 327950288 ^ (65535 * static_cast<uint32_t>(seed));
}

uint32_t XRand::NextUInt() {
  const uint32_t t = x_ ^ x_ << 11;
  x_ = y_;
  y_ = z_;
  z_ = w_;
  return w_ = w_ ^ w_ >> 19 ^ t ^ t >> 8;
}

uint64_t XRand::NextULong() {
  const uint64_t high = NextUInt();
  const uint64_t low = NextUInt();
  return high << 32 | low;
}

uint32_t XRand::NextUInt(uint32_t m) {
  assert(m != 0);
  return NextUInt() % m;
}

uint64_t XRand::NextULong(uint64_t m) {
  assert(m != 0);
  return NextULong() % m;
}

int32_t XRand::NextInt(int32_t a, int32_t b) {
  assert(a <= b);
  return a + NextUInt(b - a + 1);
}

int64_t XRand::NextLong(int64_t a, int64_t b) {
  assert(a <= b);
  return a + NextULong(b - a + 1);
}

uint32_t XRand::NextUIntUnbiased(uint32_t m) {
  assert(m != 0);
  if (m & (m - 1)) {
    const uint32_t limit = UINT32_MAX / m * m;
    for (; ; ) {
      const uint32_t value = NextUInt();
      if (value < limit) {
        return value % m;
      }
    }
  } else {
    return NextUInt() & (m - 1);
  }
}

uint64_t XRand::NextULongUnbiased(uint64_t m) {
  assert(m != 0);
  if (m & (m - 1)) {
    const uint64_t limit = UINT64_MAX / m * m;
    for (; ; ) {
      const uint64_t value = NextULong();
      if (value < limit) {
        return value % m;
      }
    }
  } else {
    return NextULong() & (m - 1);
  }
}

int32_t XRand::NextIntUnbiased(int32_t a, int32_t b) {
  assert(a <= b);
  return a + NextUIntUnbiased(b - a + 1);
}

int64_t XRand::NextLongUnbiased(int64_t a, int64_t b) {
  assert(a <= b);
  return a + NextULongUnbiased(b - a + 1);
}

double XRand::NextDouble() {
  static const uint64_t kNumValues = 1LL << 53;
  return static_cast<double>(NextULong() & (kNumValues - 1)) / kNumValues;
}

double XRand::NextGaussian() {
  static const double kPi = acos(-1.0);
  const double value1 = NextDouble();
  const double value2 = NextDouble();
  return sqrt(-2.0 * log1p(-value1)) * cos(2.0 * kPi * value2);
}

template <typename RandomAccessIterator>
void XRand::Shuffle(RandomAccessIterator first, RandomAccessIterator last) {
  for (RandomAccessIterator iter = first; iter != last; ++iter) {
    std::iter_swap(first + NextUInt(iter - first + 1), iter);
  }
}

#endif  // #ifndef XRAND_H_

// 乱数初期化
XRand rand(15);

vector<int> parallelh(vector<int> aa,int k,int h){
    vector<pair<int,int>> a(0);
    int c=0,r=0,v=0,vv=0,vc=0,rt=1;
    for (int i=0;i<aa.size();i++){
        a.push_back(make_pair(aa[i],i));
        if (aa[i]!=h) {c+=aa[i];r++;}
        if (aa[i]<=h-k) {v++;vv+=aa[i];}
        if (aa[i]==h-k) vc++;
        if (aa[i]<h && aa[i]>h-k) rt=0;
    }
    if (rt==0) vc=0;
    sort(all(a));
    reverse(all(a));
    int u=k;
        if (r%2==0){
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    a[i].first=h;
                } else if (a[i].first<h-k-1) {
                    int y=min(a[i].first+u,h-k-1);
                    u-=y-a[i].first;
                    a[i].first=y;
                }
            }
            if (u==k){
                for (int i=0;i<a.size();i++){
                if (a[i].first==h-k-1){
                    if (u>=k-1 && u>0) {a[i].first++;u--;}
                }
            }
            }
        }
        else if (k%2==1) {
            bool re=true;
            int uc=(v-1)*(h-k)+(h-k-1);
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=(r-1)*(h-k)+(h-k-1);
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=(rr-1)*(h-k)+(h-k-1);
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    int w=rand.NextInt(1, k);
                    int ww=rand.NextInt(1, w);
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
        else {
            bool re=true;
            int uc=v*(h-k-1)+((v-1)/2)%(k/2+1)*2;
            if (vc%2==0 && uc%(k+1)==vv%(k+1) && vc>0){
                for (int i=0;i<a.size();i++){
                    if (a[i].first==h-k) {
                        a[i].first++;
                        break;
                    }
                }
                re=false;
            }
            if (re){
            int yu=0;
            for (int i=0;i<a.size();i++){
                if (a[i].first<h && a[i].first>=h-u){
                    u-=h-a[i].first;
                    c-=a[i].first;
                    a[i].first=h;
                    r--;
                    yu++;
                }
            }
            int e=r*(h-k-1)+((r-1)/2)%(k/2+1)*2;
            if (yu==1){
                int rr=0,cc=0;
                for (int i=0;i<a.size();i++){
                    if (a[i].first<h-k){
                        cc+=a[i].first;
                        rr++;
                    }
                }
                int ee=0;
                if (rr>0) ee=rr*(h-k-1)+((rr-1)/2)%(k/2+1)*2;
                if (ee%(k+1)==cc%(k+1)) {
                    if (u>0) a[a.size()-1].first++;
                }
            }
            if (yu==0) {
                if (e%(k+1)==c%(k+1)) {
                    int w=rand.NextInt(1, k);
                    int ww=rand.NextInt(1, w);
                    int www=w-ww;
                    for (int i=a.size()-1;i>=0;i--){
                        if (a[i].first<h){
                            if (ww!=0){
                                a[i].first+=ww;
                                ww=0;
                            }
                            else if (www!=0){
                                a[i].first+=www;
                                www=0;
                            }
                        }
                    }
                }
                else {
                    int w=(k+1+e%(k+1)-c%(k+1))%(k+1);
                    for (int i=0;i<a.size();i++){
                        if (a[i].first<h-k){
                            int uu=min(w,h-k-1-a[i].first);
                            w-=uu;
                            a[i].first+=uu;
                        }
                    }
                    if (w!=0){
                        for (int i=0;i<a.size();i++){
                            if (a[i].first==h-k-1){
                                if (w>0){
                                    a[i].first++;
                                    w--;
                                }
                            }
                        }
                    }
                }
            }
        }
        }
    vector<int> ans(a.size());
    for (int i=0;i<a.size();i++){
        ans[a[i].second]=min(h,a[i].first);
    }
    return ans;
}

int main() {
  int n,k,h;
  cin >> n >> k >> h;
  if (k>=h) cout << "first" << endl;
  else if (k%2==0){
      if ((n*(h-k-1)+((n-1)/2)%(k/2+1)*2)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  else {
      if (((n-1)*(h-k)+h-k-1)%(k+1)==0) cout << "second" << endl;
      else cout << "first" << endl;
  }
  while(true){
      vector<int> a(n);
      rep(i,n) cin >> a[i];
      bool t=true;
      rep(i,n){
          if (a[i]!=-1 && a[i]!=h) t=false; 
      }
      if (t) break;
      vector<int> b(n);
      b=parallelh(a,k,h);
      rep(i,n-1) cout << b[i] << " ";
      cout << b[n-1] << endl;
  }
}
accuracy: 1
time_ms: 110
memory_kb: 4172
final_rank: 6