using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = NN; var map = NArr(n); { var set = new HashSet() { 0 }; for (var i = 0; i < n; ++i) set.Add(map[i][0]); var list = new List(set); list.Sort(); var dic = new Dictionary(); for (var i = 0; i < list.Count; ++i) dic[list[i]] = i; for (var i = 0; i < n; ++i) map[i][0] = dic[map[i][0]]; } { var set = new HashSet() { 0 }; for (var i = 0; i < n; ++i) set.Add(map[i][1]); var list = new List(set); list.Sort(); var dic = new Dictionary(); for (var i = 0; i < list.Count; ++i) dic[list[i]] = i; for (var i = 0; i < n; ++i) map[i][1] = dic[map[i][1]]; } var lists = new List[n + 1]; for (var i = 0; i < lists.Length; ++i) lists[i] = new List(); for (var i = 0; i < n; ++i) lists[map[i][0]].Add(map[i]); var seg = new AtCoder.Segtree(n + 1); for (var i = 0; i < lists.Length; ++i) { var add = new List<(int b, int c)>(); foreach (var li in lists[i]) { add.Add((li[1], seg.Prod(0, li[1]) + li[2])); } foreach (var ai in add) seg[ai.b] = Math.Max(seg[ai.b], ai.c); } WriteLine(seg.AllProd); } struct SegOp : AtCoder.ISegtreeOperator { public int Identity => 0; public int Operate(int x, int y) { return Math.Max(x, y); } } }