//порядковые статистики

#include <iostream>
#include <random>

using namespace std;
using type = int;

mt19937 rnd(35465464);

struct Node
{

	type x;
	int y;
	Node* left;
	Node* right;
	int tSize;

	Node(type x_)
	{
		x = x_;
		y = rnd();
		left = nullptr;
		right = nullptr;
		tSize = 1;
	};

};


int getSize(Node* t)
{
	if (t == nullptr)
		return 0;
	else
		return t->tSize;
}


void recalc(Node* t)
{
	t->tSize = getSize(t->left) + getSize(t->right) + 1;
}


pair<Node*, Node*> Split(Node* t, type x)
{
	if (t == nullptr)
	{
		return { nullptr, nullptr };
	}
	if (t->x >= x)
	{
		auto temp = Split(t->left, x);
		t->left = temp.second;
		recalc(t);
		return { temp.first, t };
	}
	else
	{
		auto temp = Split(t->right, x);
		t->right = temp.first;
		recalc(t);
		return { t, temp.second };
	}
}

Node* Merge(Node* l, Node* r)
{
	if (l == nullptr)
		return r;
	if (r == nullptr)
		return l;
	if (l->y > r->y)
	{
		l->right = Merge(l->right, r);
		recalc(l);
		return l;
	}
	else
	{
		r->left = Merge(l, r->left);
		recalc(r);
		return r;
	}
}

Node* Insert(Node* t, type x)
{
	auto temp = Split(t, x);
	auto nodex = new Node(x);
	return Merge(Merge(temp.first, nodex), temp.second);
}

void Delete(Node* t)
{
	if (t == nullptr)
		return;
	Delete(t->left);
	Delete(t->right);
	delete t;
}

Node* Remove(Node* t, type x)
{
	auto temp = Split(t, x);
	auto temp2 = Split(temp.second, x + 1);
	Delete(temp2.first);
	return Merge(temp.first, temp2.second);
}

Node* IsThere(Node* t, type x)
{
	if (t == nullptr)
		return nullptr;
	if (t->x == x)
		return t;
	if (t->x > x)
		return IsThere(t->left, x);
	else
		return IsThere(t->right, x);
}


Node* kth(Node* t, int k)
{
	if (!t)
		return nullptr;
	if (getSize(t->left) == k - 1)
		return t;
	if (getSize(t->left) > k - 1)
		return kth(t->left, k);
	else
		return kth(t->right, k - getSize(t->left) - 1);
}


int main()
{
	Node* tree = nullptr;
	while (true)
	{
		char str;
		type N;
		cin >> str;
		if (str == '+')
		{
			cin >> N;
			tree = Insert(tree, N);
		}
		if (str == '-')
		{
			cin >> N;
			tree = Remove(tree, N);
		}
		if (str == '?')
		{
			cin >> N;
			if (IsThere(tree, N) == nullptr)
				cout << "NO";
			else
				cout << "YES";

		}
		if (str == 'k')
		{
			int k;
			cin >> k;
			auto res = kth(tree, k);
			if (res == nullptr)
				cout << "trere is no kth element" << endl;
			else
				cout << "kth element = " << res->x << endl;
		}

	}
	return 0;

}
