static void Main() { var qc = int.Parse(Console.ReadLine()); var qs = Array.ConvertAll(new bool[qc], _ => ReadL()); const int n = 1 << 20; var a = new long[n]; Array.Fill(a, -1); var set = new WBSet <int>(); for (int i = 0; i < n; i++) { set.Add(i); } Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); foreach (var q in qs) { var x = q[1]; var xi = x % n; if (q[0] == 1) { var i = set.GetFirstIndex(yi => yi >= xi); if (i == set.Count) { i = 0; } var h = set.RemoveAt(i); a[h] = x; } else { Console.WriteLine(a[xi]); } } Console.Out.Flush(); }
static object Solve() { var n = int.Parse(Console.ReadLine()); var abs = Array.ConvertAll(new bool[n], _ => Read2()); var a = Array.ConvertAll(abs, p => p.a); var b = Array.ConvertAll(abs, p => p.b); var s = CumSumL(a); // B_i を購入するまでのコストの最小値 var dp = new long[n + 1]; // 購入前の所持金に対する最小のインデックス var set = new WBSet <long>(); var map = new Dictionary <long, int>(); const long max = 1L << 60; for (int i = 0; i < n; i++) { var nv = s[i + 1] - dp[i]; if (set.Count == 0 || set.GetLast() < nv) { set.Add(nv); map[nv] = i; } if (i > 0 && b[i - 1] > b[i]) { b[i] = b[i - 1]; } var fv = set.GetFirst(x => x >= b[i], max); if (fv == max) { return(-1); } var j = map[fv]; dp[i + 1] = dp[j] + b[i]; } return(s[n] - dp[n]); }