#include <iostream>
#include <random>

using namespace std;
using type = int;

mt19937 rnd(35465464);

struct Node
{

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

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

};


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;
		return { temp.first, t };
	}
	else
	{
		auto temp = Split(t->right, x);
		t->right = temp.first;
		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);
		return l;
	}
	else
	{
		r->left = Merge(l, r->left);
		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);
}


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";
				
			}

		}
		return 0;

	}
