#include<chrono>
#include<iostream>
#include<random>
#include<vector>
using namespace std;
#define ll long long

//乱数生成器
random_device rnd;
mt19937 mt(rnd());

//色々計算する用
int C[26],last2[26],T[365],Tans[365],V[365],Vorigin[365];
int S[365][26],last[365][26],last_sim[365][26];
int D,vmax,dadd_best,steps=0;

//1点変更用
int drand,qrand,torigin;

//リセット用の関数
void R26(int A[26]){
    for(int i=0;i<26;++i)A[i]=0;
}

void R365(int A[365]){
    for(int i=0;i<365;++i)A[i]=0;
}

void R365_26(int A[365][26]){
    for(int i=0;i<365;++i)for(int j=0;j<26;++j)A[i][j]=0;
}

void copy26(int A[26]/*コピー先*/,int B[26]/*コピー元*/){
    for(int i=0;i<26;++i)A[i]=B[i];
}

void copy365(int A[365]/*コピー先*/,int B[365]/*コピー元*/){
    for(int i=0;i<365;++i)A[i]=B[i];
}

void copy365_26(int A[365][26]/*コピー先*/,int B[365][26]/*コピー元*/){
    for(int i=0;i<365;++i)for(int j=0;j<26;++j)A[i][j]=B[i][j];
}

//乱数の生成
int gen_rnd(int maxval){
    return mt()%maxval;
}

/*-----ここから下は計算のメイン部分----*/
//貪欲法による初期解の生成
void greedy(){
    int dadd,i,j,k,l,i_calc,tbest,score,vbest;
    for(dadd=0;dadd<=26;++dadd){
        //リセット
        R26(last2);
        R365_26(last);

        for(i=0;i<D;++i){
            i_calc=min(i+dadd+1,D);
            for(j=0;j<26;++j){
                //得点の初期化
                if(i==0){
                    V[i]=0;
                }else{
                    V[i]=V[i-1];
                }
                
                //lastの初期化
                if(i==0)R26(last[i]);
                else copy26(last[i],last[i-1]);

                last[i][j]=i+1;
                V[i]+=S[i][j];

                for(k=0;k<26;++k)
                    for(l=i;l<i_calc;l++)V[i]-=C[k]*(l+1-last[i][k]);

                if(j==0||V[i]>=vmax){
                    vmax=V[i];
                    tbest=j;
                }
            }
            if(i==0)R26(last[i]);
            else copy26(last[i],last[i-1]);
            T[i]=tbest+1;
            last[i][tbest]=i+1;
        }

        //得点の再計算
        score=0;
        R26(last2);

        for(i=0;i<D;++i){
            score+=S[i][T[i]-1];
            last2[T[i]-1]=i+1;
            for(j=0;j<26;j++)score-=C[j]*(i+1-last2[j]);
        }

        if(dadd==0||(dadd!=0 && score>vbest)){
            dadd_best=dadd;
            vbest=score;
            copy365(Tans,T);
            copy365_26(last_sim,last);
        }
    }

    vmax=vbest;
    copy365(T,Tans);
    copy365_26(last,last_sim);
}

//1点変更
void change_one(){
    int i,j;

    drand=gen_rnd(D);
    qrand=gen_rnd(26);

    copy365_26(last_sim,last);
    copy365(Vorigin,V);

    //drand日目に行うコンテストをqrandに変更する
    //last_simの書き換え
    torigin=T[drand];
    if(drand==0){
        last_sim[0][T[drand]]=0;
        last_sim[0][qrand]=1;
    }else{
        last_sim[drand][T[drand]]=last[drand-1][T[drand]];
        last_sim[drand][qrand]=drand+1;
    }
    T[drand]=qrand+1;

    //drand日以降の得点の再計算
    for(i=drand;i<D;i++){
        if(i==0){
            V[i]=0;
        }else{
            V[i]=V[i-1];
            copy26(last_sim[i],last_sim[i-1]);
        }
        V[i]+=S[i][T[i]-1];

        for(j=0;j<26;j++)V[i]-=C[j]*(j+1-last_sim[i][j]);
    }

    if(V[D-1]>vmax){
        vmax=V[D-1];
        copy365_26(last,last_sim);
    }else{
        copy365(V,Vorigin);
        T[drand]=torigin;
    }
}

int main(){
    chrono::system_clock::time_point start,end;
    float elapsed;
    int i,j;

    start=chrono::system_clock::now();
    cin>>D;
    for(i=0;i<26;++i)scanf("%d",&C[i]);
    for(i=0;i<D;++i)for(j=0;j<26;++j)scanf("%d",&S[i][j]);

    //初期解の生成    
    greedy();

    end=chrono::system_clock::now();
    elapsed=chrono::duration_cast<chrono::milliseconds>(end-start).count();

    //局所最適化
    while(elapsed<=1990){
        //steps++;
        change_one();

        //elapsedの更新
        end=chrono::system_clock::now();
        elapsed=chrono::duration_cast<chrono::milliseconds>(end-start).count();
    }

    for(i=0;i<D;++i)printf("%d\n",T[i]);
  	//cout<<steps<<endl;
    return 0;
}


Measured memory_bytes: 3376