using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; public sealed partial class Program { public void EntryPoint() { var a = scanner; var n = a.N(); var d = a.L(); var tasks = Enumerable.Range(0, n).Select(i => new { t = a.L(), k = a.L() }).ToArray(); var tokyo = 0L; var kyoto = -d; foreach (var task in tasks) { var t = Math.Max(tokyo + task.t, kyoto + task.t - d); var k = Math.Max(tokyo + task.k - d, kyoto + task.k); tokyo = t; kyoto = k; } WriteLine(Math.Max(tokyo, kyoto)); } } #region Custom Library public static class TemplateExtension { public static X[] MakeArray(this int count, Func func) { var xs = new X[count]; for (var i = 0; i < count; i++) { xs[i] = func(i); } return xs; } public static int[] Range(this int count, int start = 0) { return count.MakeArray(i => i + start); } public static string Intercalate(this IEnumerable @this, string separator) { return string.Join(separator, @this); } public static void ForEach(this IEnumerable @this, Action action) { var list = @this as IReadOnlyList; if (list != null) { var count = list.Count; for (var i = 0; i < count; i++) { action(list[i], i); } } else { var i = 0; foreach (var x in @this) { action(x, i); i++; } } } } public sealed class Scanner { readonly TextReader reader; readonly StringBuilder sb = new StringBuilder(); /// /// Reads next word separated by spaces. /// public string Word() { sb.Clear(); while (true) { var r = reader.Read(); if (r == '\r') { if (reader.Peek() == '\n') reader.Read(); break; } else if (r == -1 || r == ' ' || r == '\n') { break; } else { sb.Append((char)r); } } return sb.ToString(); } /// /// Reads next word as . /// public int N() { return int.Parse(Word()); } /// /// Reads next word as . /// public long L() { return long.Parse(Word()); } /// /// Reads next word as . /// public double F() { return double.Parse(Word()); } public int[] Ns(int count) { return count.MakeArray(_ => N()); } public long[] Ls(int count) { return count.MakeArray(_ => L()); } public double[] Fs(int count) { return count.MakeArray(_ => F()); } /// /// Reads next line and splits it by spaces. /// public X[] Words(Func func) { return reader.ReadLine().Split(' ').Select(func).ToArray(); } public Scanner(TextReader reader) { this.reader = reader; } } public partial class Program { readonly TextReader input; readonly TextWriter output; readonly Scanner scanner; void WriteLine(int value) { output.WriteLine(value); } void WriteLine(long value) { output.WriteLine(value); } void WriteLine(double value) { output.WriteLine(value); } void WriteLine(char value) { output.WriteLine(value); } void WriteLine(string value) { output.WriteLine(value); } public Program(TextReader input, TextWriter output) { this.input = input; this.output = output; scanner = new Scanner(input); } public static void Main(string[] args) { #if DEBUG using (var writer = new VainZero.IO.DebugTextWriter(Console.Out)) #else var writer = Console.Out; #endif { new Program(Console.In, writer).EntryPoint(); } } } #endregion