namespace test
{
internal class Program
{
static void Main(string[] args)
{
cin = new input();
mod = new mod(998244353);
toolbox = new toolbox();
Priority_Queue = new Priority_Queue(true);
var sw = new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
Console.SetOut(sw);
toolbox.StartTimer();
int q=cin.intreed();
int k=cin.intreed();
var tree=new BinaryTrie64();
while(q-->0)
{
if(cin.intreed()==1)
tree.Insert(cin.longreed());
else
if(tree.Size>=k)
{
var val=tree[k];
System.Console.WriteLine(val);
tree.Erase(val);
}
else
System.Console.WriteLine(-1);
}
toolbox.PrintElapsedTime();
Console.Out.Flush();
}
static input cin;
static mod mod;
static toolbox toolbox;
static Priority_Queue Priority_Queue;
}
public class BinaryTrie64
{
private const int B = 64; // long は64ビット
private class Node
{
public int Count; // 部分木に含まれる要素数
public Node Left; // ビット0枝
public Node Right; // ビット1枝
public Node()
{
Count = 0;
Left = null;
Right = null;
}
}
private Node root = null;
// ————————————————
// 挿入/削除(点更新)
// ————————————————
private Node Add(Node t, long val, int b)
{
if (t == null) t = new Node();
t.Count++;
if (b < 0) return t;
int bit = (int)((val >> b) & 1L);
if (bit == 0)
t.Left = Add(t.Left, val, b - 1);
else
t.Right = Add(t.Right, val, b - 1);
return t;
}
private Node Sub(Node t, long val, int b)
{
if (t == null) return null;
t.Count--;
if (t.Count == 0) return null;
if (b < 0) return t;
int bit = (int)((val >> b) & 1L);
if (bit == 0)
t.Left = Sub(t.Left, val, b - 1);
else
t.Right = Sub(t.Right, val, b - 1);
return t;
}
// ————————————————
// XOR最小値/最大値取得
// ————————————————
private long GetMin(Node t, long val, int b)
{
if (t == null) throw new InvalidOperationException("Trie is empty");
if (b < 0) return 0;
int f = (int)((val >> b) & 1L);
Node targetChild = (f == 0) ? t.Left : t.Right;
if (targetChild == null)
{
f = 1 - f;
targetChild = (f == 0) ? t.Left : t.Right;
}
long res = GetMin(targetChild, val, b - 1);
return res | ((long)f << b);
}
// ————————————————
// k番目小さい要素取得
// ————————————————
private long Get(Node t, int k, int b)
{
if (t == null || k < 1 || k > t.Count)
throw new ArgumentOutOfRangeException(nameof(k));
long result = 0;
while (b >= 0 && t != null)
{
int leftCount = t.Left != null ? t.Left.Count : 0;
if (k <= leftCount)
{
t = t.Left;
}
else
{
result |= (1L << b);
t = t.Right;
k -= leftCount;
}
b--;
}
return result;
}
// ————————————————
// lower_bound/upper_bound の内部:要素 < val の個数を数える
// ————————————————
private int CountLower(Node t, long val, int b)
{
if (t == null || b < 0) return 0;
int bit = (int)((val >> b) & 1L);
int cnt = (bit == 1 && t.Left != null) ? t.Left.Count : 0;
Node targetChild = (bit == 0) ? t.Left : t.Right;
return cnt + CountLower(targetChild, val, b - 1);
}
// ————————————————
// public API
// ————————————————
/// 集合の要素数を返す。
public int Size => root != null ? root.Count : 0;
/// 空かどうかを返す。
public bool IsEmpty => root == null;
/// x を集合に追加する。
public void Insert(long x) => root = Add(root, x, B - 1);
/// x を集合から削除する(存在しない場合は何もしない)。
public void Erase(long x) => root = Sub(root, x, B - 1);
/// x XOR v が最小となる v を返す。
public long MinXor(long x) => GetMin(root, x, B - 1);
/// x XOR v が最大となる v を返す。
public long MaxXor(long x) => GetMin(root, ~x, B - 1);
/// 集合内の最小要素を返す。
public long MinElement() => MinXor(0);
/// 集合内の最大要素を返す。
public long MaxElement() => MaxXor(0);
///
/// lower_bound(x):
/// 集合内で値 x 以上の最小の要素の「番号」を取得します。
/// ここで「番号」とは小さい方から何番目か(1-indexed)を指します。
/// ⇒ 内部的には要素 < x の個数 + 1を返します。
/// つまり、集合の最大値より大きいvalを投げると、集合の要素数 + 1が返ってくる
///
public int LowerBound(long val) => CountLower(root, val, B - 1) + 1;
///
/// upper_bound(x):
/// 集合内で値 x より大きい最小の要素の「番号」を取得します。
/// ここで「番号」とは小さい方から何番目か(1-indexed)を指します。
/// ⇒ 内部的には要素 ≤ x の個数 + 1を返します(val+1 を lower_bound しているため)。
/// つまり、集合の最大値以上のvalを投げると、集合の要素数 + 1が返ってくる
///
public int UpperBound(long val) => CountLower(root, val + 1, B - 1) + 1;
/// k 番目(1-indexed)に小さい要素を返す。
public long this[int k] => Get(root, k, B - 1);
/// 要素 val の集合内での個数を返す。
public int Count(long val)
{
Node t = root;
for (int i = B - 1; i >= 0 && t != null; i--)
{
int bit = (int)((val >> i) & 1L);
t = (bit == 0) ? t.Left : t.Right;
}
return t != null ? t.Count : 0;
}
}
public static class Extensions
{
public static Dictionary safe_addtion_for_dictionary_int(this Dictionary dic, T key)
{
if (dic.ContainsKey(key))
dic[key]++;
else
dic.Add(key, 1);
return dic;
}
public static Dictionary safe_addtion_for_dictionary_long(this Dictionary dic, T key)
{
if (dic.ContainsKey(key))
dic[key]++;
else
dic.Add(key, 1);
return dic;
}
public static Dictionary> safe_addtion_for_list_in_dictionary(this Dictionary> dic, T key, T2 value)
{
if (dic.ContainsKey(key))
dic[key].Add(value);
else
dic.Add(key, new List() { value });
return dic;
}
public static T list_pop_back(this List a)
{
var k = a[a.Count - 1];
a.RemoveAt(a.Count - 1);
return k;
}
public static T chmin(ref this T a, T b)
where T : struct, IComparable
{
if (a.CompareTo(b) > 0)
return a = b;
else
return a;
}
public static T chmax(ref this T a, T b)
where T : struct, IComparable
{
if (a.CompareTo(b) < 0)
return a = b;
else
return a;
}
}
internal class input
{
string[] soloinput;
int t;
public input()
{
soloinput = new string[0];
t = 0;
}
public string soloreed()
{
if (t < soloinput.Length)
{
return soloinput[t++];
}
string input = Console.ReadLine();
while (input == "")
{
input = Console.ReadLine();
}
soloinput = input.Split(" ");
t = 0;
return soloinput[t++];
}
public int intreed()
{
return int.Parse(soloreed());
}
public int[] arrayint(int N)
{
int[] A = new int[N];
for (int i = 0; i < N; i++)
{
A[i] = intreed();
}
return A;
}
public long longreed()
{
return long.Parse(soloreed());
}
public long[] arraylong(long N)
{
long[] A = new long[N];
for (long i = 0; i < N; i++)
{
A[i] = longreed();
}
return A;
}
public decimal decimalreed()
{
return decimal.Parse(soloreed());
}
public decimal[] arraydecimal(long N)
{
decimal[] A = new decimal[N];
for (decimal i = 0; i < N; i++)
{
A[(long)i] = decimalreed();
}
return A;
}
}
internal class mod
{
public long T { get; set; }
public mod(long mod = 1000000007)
{
T = mod;
}
public long addition(long A, long B)
{
long C = A + B;
return (long)C % T;
}
public long subtraction(long A, long B)
{
return ( (A % T) - (B % T) + T ) % T;
}
public long multiplication(long A, long B)
{
return ((A % T) * (B % T)) % T;
}
}
internal class toolbox
{
string Y = "Yes";
string N = "No";
static input cin;
private DateTime? startTime;
public toolbox()
{
cin = new input();
}
public long[] CumulativeSum(long[] A, bool mode = true)
{
if (mode == false) Array.Reverse(A);
long[] back = new long[A.Length + 1];
back[0] = 0;
for (int i = 1; i <= A.Length; i++)
{
back[i] = back[i - 1] + A[i - 1];
}
if (mode == false) Array.Reverse(A);
return back;
}
public long[] Eratosthenes(long A)
{
A++;
var back = new List();
bool[] ch = new bool[A];
for (int i = 2; i < A; i++) ch[i] = true;
for (long i = 2; i < Math.Sqrt(A); i++)
{
if (ch[i] == true)
{
back.Add(i);
for (long t = 1; i * t < A; t++)
{
ch[i * t] = false;
}
}
}
for (long i = 0; i < A; i++)
{
if (ch[i] == true) back.Add(i);
}
return back.Distinct().ToArray();
}
public void Swap(ref T a, ref T b)
{
var i = a;
a = b;
b = i;
}
public void LSwap(ref List A, int a, int b)
{
var i = A[a];
A[a] = A[b];
A[b] = i;
}
public long Gcd(long A, long B)
{
while (A != 0)
{
B %= A;
Swap(ref A, ref B);
}
return B;
}
public long[] AllDivisors(long N)
{
var back = new List();
for (int i = 1; Math.Pow(i, 2) <= N; i++)
{
if (N % i == 0)
{
back.Add(i);
back.Add(N / i);
}
}
return back.Distinct().ToArray();
}
public static IEnumerable ExhaustiveEnumeration(IEnumerable indata)
{
if (indata.Count() == 1) yield return new T[] { indata.First() };
foreach (var i in indata)
{
var used = new T[] { i };
var unused = indata.Except(used);
foreach (var t in ExhaustiveEnumeration(unused))
yield return used.Concat(t).ToArray();
}
//How to use
//var allpattern = toolbox.ExhaustiveEnumeration(Enumerable.Range(1, N));
}
public bool[,] bitallsearch(int N)
{
bool[,] back = new bool[(int)Math.Pow(2, N), N];
for (int i = 0; i < Math.Pow(2, N); i++)
{
for (int t = 0; t < N; t++)
{
var k = (i >> t) & 1;
if (k == 1)
{
back[i, t] = true;
}
}
}
return back;
}
public static int BS(T[] A, T key)
where T : IComparable
{
//このコード、定数倍が大変な事になってるので標準ライブラリを使いましょう(BinarySearch)
int left = 0;
int right = A.Length;
int mid = 0;
while (left < right)
{
mid = (left + right) / 2;
if (A[mid].CompareTo(key) == 0)
return mid;
else if (A[mid].CompareTo(key) > 0)
right = mid;
else if (A[mid].CompareTo(key) < 0)
left = mid + 1;
}
return -1;
}
public static int lower_bound(T[] a, T v)
{
return lower_bound(a, v, Comparer.Default);
}
public static int lower_bound(T[] A, T key, Comparer v)
{
int left = 0;
int right = A.Length - 1;
int mid = 0;
var W = 0;
while (left <= right)
{
mid = (left + right) / 2;
W = v.Compare(A[mid], key);
if (W == -1)
left = mid + 1;
else
right = mid - 1;
}
return left;
}
public long[] prime_factorize(long N)
{
long T = N;
var back = new List();
for (long i = 2; i * i <= T; i++)
{
if (T % i != 0) continue;
while (T % i == 0)
{
back.Add(i);
T /= i;
}
}
if (T != 1) back.Add(T);
return back.ToArray();
}
public long[] One_dimensional_Coordinate_Compression(long[] A)
{
long[] back = new long[A.Length];
var T = A.Distinct().ToList();
T.Sort();
for (int i = 0; i < A.Length; i++)
back[i] = T.BinarySearch(A[i]);
return back;
}
public void setYN(string A = "Yes", string B = "No")
{
Y = A;
N = B;
}
public void YN(bool ans)
{
if (ans)
Console.WriteLine(Y);
else
Console.WriteLine(N);
}
public string[] x_dekakou(int H, int W)
{
var s = new string[H + 2];
for (int i = 0; i < W + 2; i++)
{
s[0] += "x";
s[H + 1] += "x";
}
for (int i = 1; i < H + 1; i++)
{
//x場外 .白 #黒
s[i] = "x" + Console.ReadLine().Replace(" ", "") + "x";
}
return s;
}
public List> x_dekakou_char(int H, int W)
{
var grid = new List>(H + 2);
var border = new List(W + 2);
for (int i = 0; i < W + 2; i++)
border.Add('x');
grid.Add(new List(border));
for (int i = 0; i < H; i++)
{
var line = Console.ReadLine()?.Replace(" ", "") ?? string.Empty;
var row = new List(W + 2);
row.Add('x');
foreach (var c in line)
row.Add(c);
row.Add('x');
grid.Add(row);
}
grid.Add(new List(border));
return grid;
}
public List> x_dekakou_string(int H, int W)
{
var back = new List>();
for (int i = 0; i < H + 2; i++)
back.Add(Enumerable.Repeat(-1, W + 2).ToList());
for (int i = 0; i < W + 2; i++)
{
back[0][i] = -1;
back[H + 1][i] = -1;
}
for (int i = 1; i <= H; i++)
{
back[i][0] = -1;
back[i][W + 1] = -1;
for (int t = 1; t <= W; t++)
back[i][t] = cin.intreed();
}
return back;
}
///
/// 配列の指定位置以降を反転する
///
/// 反転対象の配列
/// 反転開始位置(この位置以降が反転される)
private void Reverse(T[] array, int begin) where T : IComparable
{
// 反転する要素が2個未満の場合は何もしない
if (array.Length - begin < 2) return;
// 両端から中央に向かって要素を交換
int left = begin;
int right = array.Length - 1;
while (left < right)
{
Swap(ref array[left], ref array[right]);
left++;
right--;
}
}
///
/// 配列を辞書順で次の順列に変更する
/// 全ての順列を列挙するには、事前に Array.Sort() でソートした配列を渡すこと
///
/// 順列を生成する配列(事前ソート必須)
/// 次の順列が存在する場合true、最大順列の場合false
public bool NextPermutation(T[] array) where T : IComparable
{
// 辞書順で次に大きい順列を生成
// 1. 右端から降順でない位置を探す
int pivotIndex = -1;
for (int i = array.Length - 2; i >= 0; i--)
{
if (array[i].CompareTo(array[i + 1]) < 0) // 昇順ペア発見
{
pivotIndex = i;
break;
}
}
// 最大順列に到達している場合
if (pivotIndex == -1) return false;
// 2. pivotより大きい最右の要素と交換
for (int j = array.Length - 1; j > pivotIndex; j--)
{
if (array[pivotIndex].CompareTo(array[j]) < 0)
{
Swap(ref array[pivotIndex], ref array[j]);
break;
}
}
// 3. pivot以降を昇順に並べ直し
Reverse(array, pivotIndex + 1);
return true;
// how to use
// do{}while(NextPermutation)
}
///
/// 回文判定のコア処理(配列版)
///
private bool IsPalindromeCore(T[] array, int left, int right) where T : IComparable
{
while (left < right)
{
if (array[left].CompareTo(array[right]) != 0)
return false;
left++;
right--;
}
return true;
}
///
/// 回文判定のコア処理(文字列版)
///
private bool IsPalindromeCore(string str, int left, int right)
{
while (left < right)
{
if (str[left] != str[right])
return false;
left++;
right--;
}
return true;
}
///
/// 配列全体が回文かどうかを判定
///
public bool IsPalindrome(T[] array) where T : IComparable
{
return IsPalindromeCore(array, 0, array.Length - 1);
}
///
/// 文字列全体が回文かどうかを判定
///
public bool IsPalindrome(string str)
{
return IsPalindromeCore(str, 0, str.Length - 1);
}
///
/// 指定範囲が回文かどうかを判定(配列版)
///
public bool IsPalindrome(T[] array, int start, int end) where T : IComparable
{
return IsPalindromeCore(array, start, end);
}
///
/// 指定範囲が回文かどうかを判定(文字列版)
///
public bool IsPalindrome(string str, int start, int end)
{
return IsPalindromeCore(str, start, end);
}
///
/// 指定長さの部分配列に回文が含まれるかを判定
///
public bool HasPalindrome(T[] array, int length) where T : IComparable
{
for (int i = 0; i <= array.Length - length; i++)
{
if (IsPalindromeCore(array, i, i + length - 1))
return true;
}
return false;
}
///
/// 指定長さの部分文字列に回文が含まれるかを判定
///
public bool HasPalindrome(string str, int length)
{
for (int i = 0; i <= str.Length - length; i++)
{
if (IsPalindromeCore(str, i, i + length - 1))
return true;
}
return false;
}
public long modpow(long x, long p, long mod = 1000000007)
{
long result = 1;
x %= mod;
while (p > 0)
{
if (p % 2 == 1) // pが奇数の場合
{
result = (result * x) % mod;
}
x = (x * x) % mod; // xを二乗(これが繰り返し二乗)
p /= 2; // pを半分にする
}
return result;
}
public void StartTimer()
{
startTime = DateTime.Now;
}
public void PrintElapsedTime(bool error_output = true)
{
//標準出力ではなくて標準エラー出力を使ってるのでatcoderのジャッジはこの出力を無視する つまり消さなくてok 便利だね
if (startTime.HasValue)
{
var elapsed = DateTime.Now - startTime.Value;
if (error_output)
Console.Error.WriteLine($"Elapsed time: {elapsed.TotalMilliseconds} ms");
else
Console.WriteLine($"Elapsed time: {elapsed.TotalMilliseconds} ms");
}
else
{
Console.Error.WriteLine("Timer was not started.");
}
}
}
internal class Priority_Queue
{
toolbox toolbox = new toolbox();
public List<(long, long)> Queue { get; private set; }
///
/// true==>大きいやつから出るよ false==>小さいやつからでるよ
///
public bool revase { get; set; }
public Priority_Queue(bool cnt = true)
{
Queue = new List<(long, long)>();
revase = cnt;
}
public void Enqueue(long a, long b)
{
if (revase == false)
a *= -1;
int i = Queue.Count, t;
Queue.Add((a, b));
while (i != 0)
{
t = (i - 1) / 2;
if (Queue[i].Item1 > Queue[t].Item1)
{
var k = Queue[i];
Queue[i] = Queue[t];
Queue[t] = k;
i = t;
}
else
{
break;
}
}
}
public (long, long) Dequeue()
{
int a = Queue.Count - 1;
var back = Queue[0];
Queue[0] = Queue[a];
Queue.RemoveAt(a);
for (int i = 0, j; (j = 2 * i + 1) < a;)
{
if (j != a - 1 && Queue[j].Item1 < Queue[j + 1].Item1)
j++;
if (Queue[i].Item1 < Queue[j].Item1)
{
var k = Queue[i];
Queue[i] = Queue[j];
Queue[j] = k;
i = j;
}
else
{
break;
}
}
if (revase == false)
back.Item1 *= -1;
return back;
}
public (long, long) GetPeek() => (revase ? Queue[0].Item1 : Queue[0].Item1 * -1, Queue[0].Item2);
}
internal class Generic_Priority_Queue
{
toolbox toolbox = new toolbox();
public List<(long, T)> Queue { get; private set; }
///
/// true==>大きいやつから出るよ false==>小さいやつからでるよ
///
public bool revase { get; set; }
public Generic_Priority_Queue(bool cnt = true)
{
Queue = new List<(long, T)>();
revase = cnt;
}
public void Enqueue(long a, T b)
{
if (revase == false)
a *= -1;
int i = Queue.Count, t;
Queue.Add((a, b));
while (i != 0)
{
t = (i - 1) / 2;
if (Queue[i].Item1 > Queue[t].Item1)
{
var k = Queue[i];
Queue[i] = Queue[t];
Queue[t] = k;
i = t;
}
else
{
break;
}
}
}
public (long, T) Dequeue()
{
int a = Queue.Count - 1;
var back = Queue[0];
Queue[0] = Queue[a];
Queue.RemoveAt(a);
for (int i = 0, j; (j = 2 * i + 1) < a;)
{
if (j != a - 1 && Queue[j].Item1 < Queue[j + 1].Item1)
j++;
if (Queue[i].Item1 < Queue[j].Item1)
{
var k = Queue[i];
Queue[i] = Queue[j];
Queue[j] = k;
i = j;
}
else
{
break;
}
}
if (revase == false)
back.Item1 *= -1;
return back;
}
public (long, T) get_first()
{
if (Queue.Count == 0)
return (default(long), default(T));
else
return Queue[0];
}
}
}