#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); var h = I(); var w = I(); var sx = I(); var sy = I(); var n = I(); var qz = Range(n, () => (I(), I(), I())); bool R(int x1, int y1, int x2, int y2) { if (x1 == x2 || y1 == y2) return true; if (x1 - y1 == x2 - y2) return true; if (x1 + y1 == x2 + y2) return true; return false; } var s1 = 0L; var s2 = 0L; var (x1, y1) = (sx, sy); var (x2, y2) = (sx, sy); foreach (var (x, y, c) in qz) { if (R(x2, y2, x, y)) { (s1, s2) = (Math.Max(s1, s2), Math.Max(s1 + c, s2 + c)); } else { (s1, s2) = (Math.Max(s1, s2), Math.Max(s1 + c, s2)); } (x1, y1) = (x2, y2); (x2, y2) = (x, y); } var ans = Math.Max(s1, s2); Console.WriteLine(ans);