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 dic = new Dictionary>(); for (var i = 0; i < n; ++i) { var k = GetKey(map[i][0], map[i][1], map[i][2]); if (dic.ContainsKey(k)) dic[k].Add(i + 1); else dic[k] = new List() { i + 1 }; } var keys = dic.Keys.ToList(); keys.Sort((l, r) => r.CompareTo(l)); var seg = new AtCoder.Segtree(10_002); var ans = new List(); foreach (var ki in keys) { var (p, t, _) = FromKey(ki); if (seg.Prod(t, 10_001) < p) { ans.AddRange(dic[ki]); seg[t] = p; } } ans.Sort(); WriteLine(string.Join("\n", ans)); } static long GetKey(int p, int t, int r) { return p + t * 100_000L + r * 10_000_000_000; } static (int p, int t, int r) FromKey(long k) { return ((int)(k % 100_000), (int)(k / 100_000 % 100_000), (int)(k / 10_000_000_000)); } static int INF = int.MinValue / 2; struct SegOp : AtCoder.ISegtreeOperator { public int Identity => INF; public int Operate(int x, int y) { return Math.Max(x, y); } } }