local read = setmetatable({}, {__index = function(t, k) local a = {} for i=1,#k do table.insert(a, '*'..string.sub(k, i, i)) end local r = io.read local u = table.unpack or unpack return function() return r(u(a)) end end})
read.N = function(N) local t={} for i=1,N do t[i]=read.n() end return t end
string.totable = function(s) local t={} local u=string.sub for i=1,#s do t[i] = u(s, i, i) end return t end
string.split = function(s) local t={} for w in string.gmatch(s, "[^%s]+") do table.insert(t, w) end return (table.unpack or unpack)(t) end
local function array(dimension, default_val) assert(type(default_val) ~= 'table') local n=dimension local m={}if default_val~=nil then m[1]={__index=function()return default_val end}end for i=2,n do m[i]={__index=function(p, k)local c=setmetatable({},m[i-1])rawset(p,k,c)return c end}end return setmetatable({},m[n])end
local function tostringxx(o, depth) depth = depth or 0 if depth > 10 then return "<too deep!>" end if o == _G then return "<_G>" end local indent0 = (" "):rep((depth) * 2) local indent1 = (" "):rep((depth+1) * 2) local indent2= (" "):rep((depth+2) * 2) if type(o) == 'table' then local keys = {} local types = {} for k in pairs(o) do types[type(k)] = true table.insert(keys, k) end local types_count = 0 local lasttype for k in pairs(types) do types_count = types_count + 1 lasttype = k end if types_count == 1 and (lasttype == 'string' or lasttype == 'number') then table.sort(keys) end local inside = {} for i=1,#keys do local k = keys[i] local v = o[k] if type(k) == 'string' then k = string.format('%q', k) end table.insert(inside, indent1 .. '['..tostring(k)..'] = ' .. tostringxx(v, depth + 1)) end return '{\n' .. table.concat(inside, ',\n') .. '\n' .. indent0 .. '}' else if type(o) == 'string' then o = string.format('%q', o) end return tostring(o) end end
local function richtraceback() local x = 2 while true do local info = debug.getinfo(x) if not info then break end local fname = '<' .. info.short_src .. ":" .. info.linedefined .. ">" if info.name then fname = info.name end print(info.short_src .. ":" .. info.currentline .. ": in " .. ("%q"):format(fname)) print(" LOCALS:") local p = 1 while true do local name, val = debug.getlocal(x,p) if not name then break end print(" " .. name .. ": " .. tostringxx(val, 3)) p = p + 1 end print(" UPVALUES:") for p=1,info.nups do local name, val = debug.getupvalue(info.func,p) if not name then break end print(" " .. name .. ": " .. tostringxx(val, 3)) end x = x + 1 end end
local function myassert(b) if not b then richtraceback() error("assertion failed") end end 
-----------------------
local clock = os.clock
---
local D = read.n()
local C = read.N(26)
local S = {}
for i=1,D do
    S[i] = read.N(26)
end
local function greedy()
    local last = array(1, 0)
    local t = {}
    for d=1,D do
        local amax = -10^18
        local maxi = 1
        for i=1,26 do
            local ans = S[d][i]
            for j=1,26 do
                if j ~= i then
                    ans = ans - C[j] * (d - last[j])
                end
            end
            if ans > amax then
                amax = ans
                maxi = i
            end
        end
        last[maxi] = d
        t[d] = maxi
    end
    return t
end
local t
-----
local satisf_open = array(1, 0)
local satisf_wait = array(2, 0)
local last = array(2, 0)
local function evaluate_satisfs()
    -- 365 * 26 loops
    local ans = 0
    for d=1,D do
        ans = ans + satisf_open[d]
        for i=1,26 do
            ans = ans + satisf_wait[d][i]
        end
    end
    return ans
end
local function initial_evaluate(t)
    -- 365 * 26 loops
    for d=1,D do
        for i=1,26 do
            last[d][i] = last[d-1][i]
        end
        local i = t[d]
        satisf_open[d] = S[d][i]

        last[d][i] = d
        for i=1,26 do
            satisf_wait[d][i] = - C[i] * (d - last[d][i])
        end
    end
    return evaluate_satisfs()
end
-----
local function diff_evaluate(d, newt, dryrun)
    local ansdiff = 0
    -- 365*2 loops
    -- for Day d
    local oldt = t[d]
    local ansdiff = S[d][newt] - satisf_open[d]
    if not dryrun then
        satisf_open[d] = S[d][newt]
    end
    t[d] = newt
    -- for newt
    local newlast_newt = d
    for e=d,D do
        local oldlast_newt = last[e][newt]
        if last[e][newt] >= d then
            break
        else
            local daydiff = newlast_newt - oldlast_newt
            ansdiff = ansdiff + C[newt] * daydiff
            if not dryrun then
                last[e][newt] = d
            end
        end
    end
    -- for oldt
    local oldlast_oldt = d
    local newlast_oldt = 0
    if d ~= 1 then
        newlast_oldt = last[d-1][oldt]
    end
    for e=d,D do
        local test_t = last[e][oldt]
        if test_t > d then
            break
        else
            local daydiff = newlast_oldt - oldlast_oldt
            ansdiff = ansdiff + C[oldt] * daydiff
            if not dryrun then
                last[e][oldt] = newlast_oldt
            end
        end
    end
    return ansdiff
end
-----
t = greedy()
math.randomseed(0)
--local M = 2500
local ans = initial_evaluate(t)
while clock() < 1.97 do
    local diffmax, maxd, maxq = -10^18, 1, 1
    for j=1,1000 do
        local d, q = math.random(1,D), math.random(1,26)
        local diff = diff_evaluate(d, q, true)
        if diff > diffmax then
            diffmax = diff
            maxd = d
            maxq = q
        end
    end
    if diffmax > 0 then
        --print("!!", diffmax)
        diff_evaluate(maxd, maxq, false)
    end
end

for d=1,D do
    print(t[d])
end


Measured memory_bytes: 3828