Buggy python submission (verdict: Time Limit Exceeded):
#!/usr/bin/env python3

from copy import copy


def min_max_try(n, dams):
    mt_min = [0] * n
    mt_max = copy(dams)

    for _ in range(1000):
        # max -> min
        update = False
        for i in range(n):
            tmp_min = dams[i] - mt_max[i]
            if tmp_min > mt_min[(i+1) % n]:
                mt_min[(i+1) % n] = tmp_min
                update = True
            tmp_min = dams[i] - mt_max[(i+1) % n]
            if tmp_min > mt_min[i]:
                mt_min[i] = tmp_min
                update = True
        if not update:
            return mt_min, mt_max

        # min -> max
        update = False
        for i in range(n):
            tmp_max = dams[i] - mt_min[i]
            if tmp_max < mt_max[(i+1) % n]:
                mt_max[(i+1) % n] = tmp_max
                update = True
            tmp_max = dams[i] - mt_min[(i+1) % n]
            if tmp_max < mt_max[i]:
                mt_max[i] = tmp_max
                update = True
        if not update:
            return mt_min, mt_max

    return mt_min, mt_max


def check_answer(pos, val, n, dams):
    mt = [val] * n
    for i in range(n-1):
        mt[(pos+i+1) % n] = dams[(pos+i) % n] - mt[(pos+i) % n]
    ok = mt[pos] + mt[(pos+n-1) % n] == dams[(pos+n-1) % n]
    return ok, mt


def solv(n, dams):
    # print(dams)
    mt_min, mt_max = min_max_try(n, dams)
    # print(mt_min, mt_max)

    for i in range(n):
        ok, mt = check_answer(i, mt_min[i], n, dams)
        if ok:
            return ' '.join([str(m*2) for m in mt])

    idx = 0
    diff = mt_max[0] - mt_min[0]
    for i in range(1, n):
        if mt_max[i] - mt_min[i] < diff:
            diff = mt_max[i] - mt_min[i]
            idx = i

    for val in range(mt_min[idx], mt_max[idx]+1):
        ok, mt = check_answer(idx, val, n, dams)
        if ok:
            return ' '.join([str(m*2) for m in mt])

    return 'Error'


if __name__ == '__main__':

    n = int(input())

    dams = [int(a) for a in input().split()]

    ans = solv(n, dams)
    print(ans)


Fixed submission:
#!/usr/bin/env python3


def solv(n, dams):
    m = (sum(dams[::2]) - sum(dams[1::2])) // 2
    ans = [m*2]
    for i in range(n-1):
        m = dams[i] - m
        ans.append(m*2)
    return ans


if __name__ == '__main__':

    n = int(input())
    dams = [int(a) for a in input().split()]

    ans = solv(n, dams)

    print(' '.join([str(a) for a in ans]))

Buggy python submission (verdict: Time Limit Exceeded):
#!/usr/bin/env python3

from copy import copy


def min_max_try(n, dams):
    mt_min = [0] * n
    mt_max = copy(dams)

    for _ in range(1000):
        # max -> min
        update = False
        for i in range(n):
            tmp_min = dams[i] - mt_max[i]
            if tmp_min > mt_min[(i+1) % n]:
                mt_min[(i+1) % n] = tmp_min
                update = True
            tmp_min = dams[i] - mt_max[(i+1) % n]
            if tmp_min > mt_min[i]:
                mt_min[i] = tmp_min
                update = True
        if not update:
            return mt_min, mt_max

        # min -> max
        update = False
        for i in range(n):
            tmp_max = dams[i] - mt_min[i]
            if tmp_max < mt_max[(i+1) % n]:
                mt_max[(i+1) % n] = tmp_max
                update = True
            tmp_max = dams[i] - mt_min[(i+1) % n]
            if tmp_max < mt_max[i]:
                mt_max[i] = tmp_max
                update = True
        if not update:
            return mt_min, mt_max

    return mt_min, mt_max


def check_answer(pos, val, n, dams):
    mt = [val] * n
    for i in range(n-1):
        mt[(pos+i+1) % n] = dams[(pos+i) % n] - mt[(pos+i) % n]
    ok = mt[pos] + mt[(pos+n-1) % n] == dams[(pos+n-1) % n]
    return ok, mt


def solv(n, dams):
    # print(dams)
    mt_min, mt_max = min_max_try(n, dams)
    # print(mt_min, mt_max)

    idx = 0
    diff = mt_max[0] - mt_min[0]
    for i in range(1, n):
        if mt_max[i] - mt_min[i] < diff:
            diff = mt_max[i] - mt_min[i]
            idx = i

    for val in range(mt_min[idx], mt_max[idx]+1):
        ok, mt = check_answer(idx, val, n, dams)
        if ok:
            return ' '.join([str(m*2) for m in mt])

    return 'Error'


if __name__ == '__main__':

    n = int(input())

    dams = [int(a) for a in input().split()]

    ans = solv(n, dams)
    print(ans)


Fixed submission:
#!/usr/bin/env python3


def solv(n, dams):
    m = (sum(dams[::2]) - sum(dams[1::2])) // 2
    ans = [m*2]
    for i in range(n-1):
        m = dams[i] - m
        ans.append(m*2)
    return ans


if __name__ == '__main__':

    n = int(input())
    dams = [int(a) for a in input().split()]

    ans = solv(n, dams)

    print(' '.join([str(a) for a in ans]))

Buggy python submission (verdict: Time Limit Exceeded):
#!/usr/bin/env python3

from copy import copy


def min_max_try(n, dams):
    mt_min = [0] * n
    mt_max = copy(dams)

    while True:
        # max -> min
        update = False
        for i in range(n):
            tmp_min = dams[i] - mt_max[i]
            if tmp_min > mt_min[(i+1) % n]:
                mt_min[(i+1) % n] = tmp_min
                update = True
            tmp_min = dams[i] - mt_max[(i+1) % n]
            if tmp_min > mt_min[i]:
                mt_min[i] = tmp_min
                update = True
        if not update:
            return mt_min, mt_max

        # min -> max
        update = False
        for i in range(n):
            tmp_max = dams[i] - mt_min[i]
            if tmp_max < mt_max[(i+1) % n]:
                mt_max[(i+1) % n] = tmp_max
                update = True
            tmp_max = dams[i] - mt_min[(i+1) % n]
            if tmp_max < mt_max[i]:
                mt_max[i] = tmp_max
                update = True
        if not update:
            return mt_min, mt_max


def check_answer(pos, val, n, dams):
    mt = [val] * n
    for i in range(n-1):
        mt[(pos+i+1) % n] = dams[(pos+i) % n] - mt[(pos+i) % n]
    ok = mt[pos] + mt[(pos+n-1) % n] == dams[(pos+n-1) % n]
    return ok, mt


def solv(n, dams):
    # print(dams)
    mt_min, mt_max = min_max_try(n, dams)
    # print(mt_min, mt_max)

    idx = 0
    diff = mt_max[0] - mt_min[0]
    for i in range(1, n):
        if mt_max[i] - mt_min[i] < diff:
            diff = mt_max[i] - mt_min[i]
            idx = i

    for val in range(mt_min[idx], mt_max[idx]+1):
        ok, mt = check_answer(idx, val, n, dams)
        if ok:
            return ' '.join([str(m*2) for m in mt])

    return 'Error'


if __name__ == '__main__':

    n = int(input())

    dams = [int(a) for a in input().split()]

    ans = solv(n, dams)
    print(ans)


Fixed submission:
#!/usr/bin/env python3


def solv(n, dams):
    m = (sum(dams[::2]) - sum(dams[1::2])) // 2
    ans = [m*2]
    for i in range(n-1):
        m = dams[i] - m
        ans.append(m*2)
    return ans


if __name__ == '__main__':

    n = int(input())
    dams = [int(a) for a in input().split()]

    ans = solv(n, dams)

    print(' '.join([str(a) for a in ans]))