import sys
def solve():
# 標準入力から全てのデータを読み込み、空白で分割
input_tokens = sys.stdin.read().split()
if not input_tokens:
return
# ジョブの数 n
n = int(input_tokens[0])
# ジョブ情報をリストに格納 [開始時刻, 終了時刻, 価値]
jobs = []
idx = 1
for _ in range(n):
s = int(input_tokens[idx])
f = int(input_tokens[idx + 1])
v = int(input_tokens[idx + 2])
jobs.append([s, f, v])
idx += 3
# 終了時刻(インデックス1)をキーに昇順で安定ソートを実行
jobs.sort(key=lambda x: x[1])
# 添字を1から扱うため、先頭にダミー要素を追加
# sorted_jobs[j] = [sj, fj, vj]
sorted_jobs = [[-1, -1, 0]] + jobs
# 1. q(j) の計算(課題12aの処理)
q = [0] * (n + 1)
for j in range(1, n + 1):
sj = sorted_jobs[j][0]
# 線形探索で条件を満たす最大の i を探す
for i in range(j - 1, 0, -1):
if sorted_jobs[i][1] <= sj:
q[j] = i
break
# 2. OPT_j の計算(動的計画法)
# opt[j] はジョブ 1 から j までを考慮したときの最大価値
opt = [0] * (n + 1)
for j in range(1, n + 1):
vj = sorted_jobs[j][2]
# 漸化式: OPT_j = max(v_j + OPT_{q(j)}, OPT_{j-1})
include_j = vj + opt[q[j]]
exclude_j = opt[j - 1]
if include_j > exclude_j:
opt[j] = include_j
else:
opt[j] = exclude_j
# 指定された形式で出力
for j in range(1, n + 1):
print(f"opt {j} = {opt[j]}")
if __name__ == "__main__":
solve()
aW1wb3J0IHN5cwoKZGVmIHNvbHZlKCk6CiAgICAjIOaomea6luWFpeWKm+OBi+OCieWFqOOBpuOBruODh+ODvOOCv+OCkuiqreOBv+i+vOOBv+OAgeepuueZveOBp+WIhuWJsgogICAgaW5wdXRfdG9rZW5zID0gc3lzLnN0ZGluLnJlYWQoKS5zcGxpdCgpCiAgICBpZiBub3QgaW5wdXRfdG9rZW5zOgogICAgICAgIHJldHVybgogICAgCiAgICAjIOOCuOODp+ODluOBruaVsCBuCiAgICBuID0gaW50KGlucHV0X3Rva2Vuc1swXSkKICAgIAogICAgIyDjgrjjg6fjg5bmg4XloLHjgpLjg6rjgrnjg4jjgavmoLzntI0gW+mWi+Wni+aZguWIuywg57WC5LqG5pmC5Yi7LCDkvqHlgKRdCiAgICBqb2JzID0gW10KICAgIGlkeCA9IDEKICAgIGZvciBfIGluIHJhbmdlKG4pOgogICAgICAgIHMgPSBpbnQoaW5wdXRfdG9rZW5zW2lkeF0pCiAgICAgICAgZiA9IGludChpbnB1dF90b2tlbnNbaWR4ICsgMV0pCiAgICAgICAgdiA9IGludChpbnB1dF90b2tlbnNbaWR4ICsgMl0pCiAgICAgICAgam9icy5hcHBlbmQoW3MsIGYsIHZdKQogICAgICAgIGlkeCArPSAzCiAgICAKICAgICMg57WC5LqG5pmC5Yi777yI44Kk44Oz44OH44OD44Kv44K5Me+8ieOCkuOCreODvOOBq+aYh+mghuOBp+WuieWumuOCveODvOODiOOCkuWun+ihjAogICAgam9icy5zb3J0KGtleT1sYW1iZGEgeDogeFsxXSkKICAgIAogICAgIyDmt7vlrZfjgpIx44GL44KJ5omx44GG44Gf44KB44CB5YWI6aCt44Gr44OA44Of44O86KaB57Sg44KS6L+95YqgCiAgICAjIHNvcnRlZF9qb2JzW2pdID0gW3NqLCBmaiwgdmpdCiAgICBzb3J0ZWRfam9icyA9IFtbLTEsIC0xLCAwXV0gKyBqb2JzCiAgICAKICAgICMgMS4gcShqKSDjga7oqIjnrpfvvIjoqrLpoYwxMmHjga7lh6bnkIbvvIkKICAgIHEgPSBbMF0gKiAobiArIDEpCiAgICBmb3IgaiBpbiByYW5nZSgxLCBuICsgMSk6CiAgICAgICAgc2ogPSBzb3J0ZWRfam9ic1tqXVswXQogICAgICAgICMg57ea5b2i5o6i57Si44Gn5p2h5Lu244KS5rqA44Gf44GZ5pyA5aSn44GuIGkg44KS5o6i44GZCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaiAtIDEsIDAsIC0xKToKICAgICAgICAgICAgaWYgc29ydGVkX2pvYnNbaV1bMV0gPD0gc2o6CiAgICAgICAgICAgICAgICBxW2pdID0gaQogICAgICAgICAgICAgICAgYnJlYWsKICAgIAogICAgIyAyLiBPUFRfaiDjga7oqIjnrpfvvIjli5XnmoToqIjnlLvms5XvvIkKICAgICMgb3B0W2pdIOOBr+OCuOODp+ODliAxIOOBi+OCiSBqIOOBvuOBp+OCkuiAg+aFruOBl+OBn+OBqOOBjeOBruacgOWkp+S+oeWApAogICAgb3B0ID0gWzBdICogKG4gKyAxKQogICAgZm9yIGogaW4gcmFuZ2UoMSwgbiArIDEpOgogICAgICAgIHZqID0gc29ydGVkX2pvYnNbal1bMl0KICAgICAgICAjIOa8uOWMluW8jzogT1BUX2ogPSBtYXgodl9qICsgT1BUX3txKGopfSwgT1BUX3tqLTF9KQogICAgICAgIGluY2x1ZGVfaiA9IHZqICsgb3B0W3Fbal1dCiAgICAgICAgZXhjbHVkZV9qID0gb3B0W2ogLSAxXQogICAgICAgIAogICAgICAgIGlmIGluY2x1ZGVfaiA+IGV4Y2x1ZGVfajoKICAgICAgICAgICAgb3B0W2pdID0gaW5jbHVkZV9qCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3B0W2pdID0gZXhjbHVkZV9qCiAgICAgICAgICAgIAogICAgIyDmjIflrprjgZXjgozjgZ/lvaLlvI/jgaflh7rlipsKICAgIGZvciBqIGluIHJhbmdlKDEsIG4gKyAxKToKICAgICAgICBwcmludChmIm9wdCB7an0gPSB7b3B0W2pdfSIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgc29sdmUoKQ==