Problem p03372 (python)

Fixed submission:
# coding: utf-8

N, C = map(int, input().split())
x_list = []
v_list = []
for i in range(N):
    xi, vi = map(int, input().split())
    x_list.append(xi)
    v_list.append(vi)

e_clock = [0] * N
e_counter = [0] * N
e_clock0 = [0] * N # 時計回りしたあと、初期位置に戻った状態
e_counter0 = [0] * N # 反時計回りしたあと、初期位置に戻った状態

# 時計回り、反時計回りはそれぞれ多くて１回ずつである
# (何度も切り替えしても、距離だけ増えて効率的でない

# 時計回りに回ったときの各地点までの取得エネルギーで最大値を格納する
cal = 0
e = 0
e0 = 0
for i in range(N):
    cal += v_list[i]
    x = x_list[i]
    e = max(e, cal - x)
    e0 = max(e0, cal - 2*x)

    e_clock[i] = e
    e_clock0[i] = e0


# 反時計回りに回ったときの各地点までの取得エネルギーで最大値を格納する
cal = 0
e = 0
e0 = 0
for i in range(N-1, -1, -1):
    cal += v_list[i]
    x = C - x_list[i]
    e = max(e, cal - x)
    e0 = max(e0, cal - 2*x)
    e_counter[i] = e
    e_counter0[i] = e0

ans = 0

for i in range(N-1):
    # 時計回りのあと、反時計回りをしたとき
    e1 = e_clock0[i] + e_counter[i+1]
    # 反時計回りのあと、時計回りをしたとき
    e2 = e_counter0[i+1] + e_clock[i]

    ans = max(ans, e1, e2)

# 上はrange(N-1)のforなので
# 時計回りと反時計回りのそれぞれでまるまる１周した場合も加える
ans = max(ans, e_clock[N-1], e_counter[0])

print(ans)

Buggy submission (verdict: Runtime Error):
# coding: utf-8

N, C = map(int, input().split())
x_list = []
v_list = []
for i in range(N):
    xi, vi = map(int, input().split())
    x_list.append(xi)
    v_list.append(vi)
energy = [0 for i in range(N)]

# スタートから近い方向で回ったときに獲得するエネルギーを初期値とする
for i in range(N):
    if x_list[i] <= C/2:
        energy[i] = sum(v_list[0:i+1]) - x_list[i]
    else:
        energy[i] = sum(v_list[i:N]) - (C - x_list[i])

for i in range(1, N-1):
    # エネルギーが前より増えた地点があったら反対周りからのエネルギー獲得もチェックする
    if energy[i] < energy[i+1]:
        tmp_en = energy[i-1]

        if x_list[i-1] <= C/2:
            for j in range(N, i + 1, -1):
                tmp_en += (v_list[j] - (C - x_list[j]))

            if tmp_en > energy[i+1]:
                energy[i+1] = tmp_en
        else:
            for j in range(i+1):
                tmp_en += (v_list[j] - x_list[j])

            if tmp_en > energy[i+1]:
                energy[i+1] = tmp_en

ans = max(energy)

print(ans)

Buggy submission (verdict: Runtime Error):
# coding: utf-8

N, C = map(int, input().split())
x_list = []
v_list = []
for i in range(N):
    xi, vi = map(int, input().split())
    x_list.append(xi)
    v_list.append(vi)

#energy_clock = list(N)
# energy_reverse= list(N)
energy = [0 for i in range(N)]

# スタートから近い方向で回ったときに獲得するエネルギーを初期値とする
for i in range(N):
    #energy_clock[i] = sum(v_list[0:i]) - x_list[i]
    # energy_reverse[i] = sum(v_list[N-1:N-1-i:-1]) - (C-x_list[N-1-i])
    if x_list[i] <= C/2:
        energy[i] = sum(v_list[0:i+1]) - x_list[i]
    else:
        energy[i] = sum(v_list[i:N]) - (C - x_list[i])

for i in range(1, N-1):
    # エネルギーが前より増えた地点があったら反対周りからのエネルギー獲得もチェックする
    if energy[i] < energy[i+1]:
        tmp_en = energy[i-1]

        if x_list[i-1] <= C/2:
            for j in range(N, i + 1, -1):
                tmp_en += (v_list[j] - (C - x_list[j]))

            if tmp_en > energy[i+1]:
                energy[i+1] = tmp_en
        else:
            for j in range(i+1):
                tmp_en += (v_list[j] - x_list[j])

            if tmp_en > energy[i+1]:
                energy[i+1] = tmp_en

ans = max(energy)

print(ans)