###
function solution (id, pr, n, a):
    lo := id * n / pr
    hi := (id + 1) * n / pr

    prefSum := array (n + 1)
    cur := 0
    for i := lo until hi:
        cur += a[i]
        prefSum[i + 1] := cur
    send (0, prefSum[hi])

    if id == 0:
        v := array (pr + 1)
        for k := 0 until pr:
            v[k + 1] := receive (k)
        for k := 1 until pr + 1:
            v[k] += v[k - 1]
#        print (v[pr])
        for k := 0 until pr:
            send (k, v[k])

    cur := receive (0)
    lowest := cur
    for i := lo until hi:
        cur += a[i]
        prefSum[i + 1] := cur
        if lowest > cur:
            lowest := cur
    send (0, lowest)

    if id == 0: 
        v := array (pr + 1)
        for k := 0 until pr:
            v[k + 1] := receive (k)
        for k := 1 until pr + 1:
            if v[k] > v[k - 1]:
                v[k] := v[k - 1]
#        print (v[pr])
        for k := 0 until pr:
            send (k, v[k])

    lowest := receive (0)
    res := lowest
    for i := lo until hi:
        if res < prefSum[i + 1] - lowest:
            res := prefSum[i + 1] - lowest
        if lowest > cur:
            lowest := cur
    send (0, res)

    if id == 0:
        global := 0 
        for k := 0 until pr:
            temp := receive (k)
            if global < temp:
                global := temp
        print (global)
