def main():

    from collections import namedtuple



    Dish = namedtuple('Dish', 'idx x v')



    n, c = list(map(int, input().split()))



    ds = []

    for i in range(n):

        x, v = list(map(int, input().split()))

        ds.append(Dish(idx=i, x=x, v=v))



    gol = [0] * n  # 時計回りの最大値

    s = 0

    ma = 0

    for d in ds:

        s += d.v

        ma = max(ma, s - d.x)

        gol[d.idx] = ma



    gor = [0] * n  # 反時計回りの最大値

    s = 0

    ma = 0

    for d in reversed(ds):

        s += d.v

        ma = max(ma, s - (c - d.x))

        gor[d.idx] = ma



    gol0 = [0] * n  # 時計回りから0に戻ったときのカロリー

    for d in reversed(ds):

        gol0[d.idx] = gol[d.idx] - d.x



    gor0 = [0] * n  # 反時計回りから0に戻ったときのカロリー

    for d in reversed(ds):

        gor0[d.idx] = gor[d.idx] - (c - d.x)



    ret = max(max(gol), max(gor))

    for l in range(n - 1):

        t = gol0[l] + gor[l + 1]

        ret = max(ret, t)



    for r in range(n - 1, 0, -1):

        t = gor0[r] + gol[r - 1]

        ret = max(ret, t)



    print(ret)





if __name__ == '__main__':

    main()

def main():

    from collections import namedtuple

    import sys

    input = sys.stdin.readline



    Sushi = namedtuple('Sushi', 'x cal')



    n, c = list(map(int, input().split()))



    a = []

    for _ in range(n):

        x, v = list(map(int, input().split()))

        a.append(Sushi(x=x, cal=v))

    # x昇順ソート済



    clock = [0] * (n + 1)  # 注目する寿司以前で離脱する最大摂取カロリー

    clock_to_0 = [0] * (n + 1)  # 時計回り->初期位置

    ma = 0  # 注目する寿司以前で離脱する最大摂取カロリー

    curr = 0  # 現在のカロリー(移動によるカロリー消費を無視)

    for i, s in enumerate(a, start=1):

        curr += s.cal

        ma = max(ma, curr - s.x)

        clock[i] = ma

        clock_to_0[i] = curr - s.x * 2



    anti = [0] * (n + 1)  # 注目する寿司以前で離脱する最大摂取カロリー

    anti_to_0 = [0] * (n + 1)  # 反時計回り->初期位置

    ma = 0  # 注目する寿司以前で離脱する最大摂取カロリー

    curr = 0  # 現在のカロリー(移動によるカロリー消費を無視)

    for i, s in zip(list(range(n, -1, -1)), reversed(a)):

        curr += s.cal

        ma = max(ma, curr - (c - s.x))

        anti[i] = ma

        anti_to_0[i] = curr - (c - s.x) * 2



    ans = 0

    for exit_pos in range(1, n + 1):

        ans = max(

            ans,

            clock_to_0[exit_pos - 1] + anti[exit_pos],

            anti_to_0[(exit_pos + 1) % (n + 1)] + clock[exit_pos]

        )



    print(ans)





if __name__ == '__main__':

    main()

def main():
    from collections import namedtuple

    Dish = namedtuple("Dish", "idx x v")
    n, c = list(map(int, input().split()))
    ds = []
    for i in range(n):
        x, v = list(map(int, input().split()))
        ds.append(Dish(idx=i, x=x, v=v))
    gol = [0] * n  # 時計回りの最大値
    s = 0
    ma = 0
    for d in ds:
        s += d.v
        ma = max(ma, s - d.x)
        gol[d.idx] = ma
    gor = [0] * n  # 反時計回りの最大値
    s = 0
    ma = 0
    for d in reversed(ds):
        s += d.v
        ma = max(ma, s - (c - d.x))
        gor[d.idx] = ma
    gol0 = [0] * n  # 時計回りから0に戻ったときのカロリー
    for d in reversed(ds):
        gol0[d.idx] = gol[d.idx] - d.x
    gor0 = [0] * n  # 反時計回りから0に戻ったときのカロリー
    for d in reversed(ds):
        gor0[d.idx] = gor[d.idx] - (c - d.x)
    ret = max(max(gol), max(gor))
    for l in range(n - 1):
        t = gol0[l] + gor[l + 1]
        ret = max(ret, t)
    for r in range(n - 1, 0, -1):
        t = gor0[r] + gol[r - 1]
        ret = max(ret, t)
    print(ret)


if __name__ == "__main__":
    main()

def main():
    from collections import namedtuple
    import sys

    input = sys.stdin.readline
    Sushi = namedtuple("Sushi", "x cal")
    n, c = list(map(int, input().split()))
    a = []
    for _ in range(n):
        x, v = list(map(int, input().split()))
        a.append(Sushi(x=x, cal=v))
    # x昇順ソート済
    clock = [0] * (n + 1)  # 注目する寿司以前で離脱する最大摂取カロリー
    clock_to_0 = [0] * (n + 1)  # 時計回り->初期位置
    ma = 0  # 注目する寿司以前で離脱する最大摂取カロリー
    curr = 0  # 現在のカロリー(移動によるカロリー消費を無視)
    for i, s in enumerate(a, start=1):
        curr += s.cal
        ma = max(ma, curr - s.x)
        clock[i] = ma
        clock_to_0[i] = curr - s.x * 2
    anti = [0] * (n + 1)  # 注目する寿司以前で離脱する最大摂取カロリー
    anti_to_0 = [0] * (n + 1)  # 反時計回り->初期位置
    ma = 0  # 注目する寿司以前で離脱する最大摂取カロリー
    curr = 0  # 現在のカロリー(移動によるカロリー消費を無視)
    for i, s in zip(list(range(n, -1, -1)), reversed(a)):
        curr += s.cal
        ma = max(ma, curr - (c - s.x))
        anti[i] = ma
        anti_to_0[i] = curr - (c - s.x) * 2
    ans = 0
    for exit_pos in range(1, n + 1):
        ans = max(
            ans,
            clock_to_0[exit_pos - 1] + anti[exit_pos],
            anti_to_0[(exit_pos + 1) % (n + 1)] + clock[exit_pos],
        )
    print(ans)


if __name__ == "__main__":
    main()

+    import sys -    Dish = namedtuple("Dish", "idx x v") +    input = sys.stdin.readline +    Sushi = namedtuple("Sushi", "x cal") -    ds = [] -    for i in range(n): +    a = [] +    for _ in range(n): -        ds.append(Dish(idx=i, x=x, v=v)) -    gol = [0] * n  # 時計回りの最大値 -    s = 0 -    ma = 0 -    for d in ds: -        s += d.v -        ma = max(ma, s - d.x) -        gol[d.idx] = ma -    gor = [0] * n  # 反時計回りの最大値 -    s = 0 -    ma = 0 -    for d in reversed(ds): -        s += d.v -        ma = max(ma, s - (c - d.x)) -        gor[d.idx] = ma -    gol0 = [0] * n  # 時計回りから0に戻ったときのカロリー -    for d in reversed(ds): -        gol0[d.idx] = gol[d.idx] - d.x -    gor0 = [0] * n  # 反時計回りから0に戻ったときのカロリー -    for d in reversed(ds): -        gor0[d.idx] = gor[d.idx] - (c - d.x) -    ret = max(max(gol), max(gor)) -    for l in range(n - 1): -        t = gol0[l] + gor[l + 1] -        ret = max(ret, t) -    for r in range(n - 1, 0, -1): -        t = gor0[r] + gol[r - 1] -        ret = max(ret, t) -    print(ret) +        a.append(Sushi(x=x, cal=v)) +    # x昇順ソート済 +    clock = [0] * (n + 1)  # 注目する寿司以前で離脱する最大摂取カロリー +    clock_to_0 = [0] * (n + 1)  # 時計回り->初期位置 +    ma = 0  # 注目する寿司以前で離脱する最大摂取カロリー +    curr = 0  # 現在のカロリー(移動によるカロリー消費を無視) +    for i, s in enumerate(a, start=1): +        curr += s.cal +        ma = max(ma, curr - s.x) +        clock[i] = ma +        clock_to_0[i] = curr - s.x * 2 +    anti = [0] * (n + 1)  # 注目する寿司以前で離脱する最大摂取カロリー +    anti_to_0 = [0] * (n + 1)  # 反時計回り->初期位置 +    ma = 0  # 注目する寿司以前で離脱する最大摂取カロリー +    curr = 0  # 現在のカロリー(移動によるカロリー消費を無視) +    for i, s in zip(list(range(n, -1, -1)), reversed(a)): +        curr += s.cal +        ma = max(ma, curr - (c - s.x)) +        anti[i] = ma +        anti_to_0[i] = curr - (c - s.x) * 2 +    ans = 0 +    for exit_pos in range(1, n + 1): +        ans = max( +            ans, +            clock_to_0[exit_pos - 1] + anti[exit_pos], +            anti_to_0[(exit_pos + 1) % (n + 1)] + clock[exit_pos], +        ) +    print(ans)