#include<iostream>
using namespace std;
struct {
int number;
int left;
int right;
int numbersum;
int treesum;
}tree[20002];
int sumsum;
inline void add(int x, int place = 0) {
tree[place].treesum++;
if (tree[place].number == x)
{
tree[place].numbersum++;
return;
}
else if (x < tree[place].number)
{
if (tree[place].left != 0)
add(x, tree[place].left);
else
{
sumsum++;
tree[place].left = sumsum;
tree[sumsum].number = x;
tree[sumsum].numbersum++;
tree[sumsum].treesum++;
}
}
else
{
if (tree[place].right != 0)
add(x, tree[place].right);
else {
sumsum++;
tree[place].right = sumsum;
tree[sumsum].number = x;
tree[sumsum].numbersum++;
tree[sumsum].treesum++;
}
}
tree[0].treesum = 0;
}
int smaller(int x, int xz = -2147483647, int place = 1) {
if (tree[place].number >= x)
{
if (tree[place].left == 0)
return xz;
else
return smaller(x, xz, tree[place].left);
}
else
{
xz = tree[place].number;
if (tree[place].right == 0)
return xz;
else
return smaller(x, xz, tree[place].right);
}
}
int bigger(int x, int xz = 2147483647, int place = 1)
{
if (tree[place].number > x)
{
xz = tree[place].number;
if (tree[place].left != 0)
return bigger(x, xz, tree[place].left);
else
return xz;
}
else
{
if (tree[place].right == 0)
return xz;
else
return bigger(x, xz, tree[place].right);
}
}
void print(int x)
{
for (int j1 = 0; j1 < x; j1++)
{
cout << j1 << ":" << endl;
cout << "number: " << tree[j1].number << endl;
cout << "numbersum: " << tree[j1].numbersum << endl;
cout << "treesum: " << tree[j1].treesum << endl;
}
}
int ranking(int x, int place = 1)
{
if (x == tree[place].number)
{
return 1 + tree[tree[place].left].treesum;
}
else if (x > tree[place].number)
{
if (tree[place].right != 0)
return tree[place].numbersum + tree[tree[place].left].treesum + ranking(x, tree[place].right);
else
return tree[place].numbersum + tree[tree[place].left].treesum+1;
}
else
{
if (tree[place].left != 0)
return ranking(x, tree[place].left);
else return 1;
}
}
int findnumber(int x, int place = 1)
{
if (x > tree[tree[place].left].treesum && x <= (tree[tree[place].left].treesum + tree[place].numbersum))
{
return tree[place].number;
}
else if (x <= tree[tree[place].left].treesum)
{
return findnumber(x, tree[place].left);
}
else
{
return findnumber(x - tree[tree[place].left].treesum - tree[place].numbersum, tree[place].right);
}
}
void tiaoshi()
{
add(1);
add(3);
add(2);
add(7);
add(5);
add(2);
add(5);
add(8);
print(7);
}
int main(void) {
int x;
cin >> x;
int j1 = 0;
int l1, l2;
for (j1 = 0; j1 < x; j1++)
{
cin >> l1 >> l2;
if (l1 == 1)
{
cout << ranking(l2) << endl;
}
if (l1 == 2)
{
if (l2 > sumsum||l2==0)
cout << "2147483647";
else
cout << findnumber(l2) << endl;
}
if (l1 == 3)
cout << smaller(l2) << endl;
if (l1 == 4)
cout << bigger(l2) << endl;
if (l1 == 5)
add(l2);
}
}