最小异或对
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

给出一个多重集合(元素可以重复的集合),你需要提供以下操作:
  1. ADD x,向多重集合里添加一个元素x,多重集合内元素可以重复
  2. DEL x,从多重集合中删除一个元素x,保证要删除的元素一定存在,如果存在多个x则仅删除其中任意1
  3. QUE,查询集合中的最小异或对的值,即找到集合中任何两个元素(可以相等)异或能得到的最小值,保证询问时集合包含的元素数量不少于2
对于每个QUE操作,你需要输出查询的结果.
以上操作中涉及的操作数x均为非负整数.

输入描述:

第一行输入操作的数量n(1 \le n \le 2 \times 10 ^ 5),以下n行每行表示一个操作,操作的格式见题面.对于非负整数x满足0 \le x < 2^{30}.

输出描述:

对于每个QUE操作,输出一行一个非负整数,表示询问的答案.
示例1

输入

复制
6
ADD 2
ADD 2
ADD 3
QUE
DEL 2
QUE

输出

复制
0
1

说明

初始集合:\{\}.

操作1向集合加入元素2,当前集合:\{2\}.

操作2向集合加入元素2,当前集合:\{2, 2\}.

操作3向集合加入元素3,当前集合:\{2, 2, 3\}.

操作4询问集合中的最小异或对,当前选取两个元素的合法方案有(2, 2), (2, 3), (2, 3),所以最小异或对的值为2\oplus 2 = 0.

操作5删除集合中元素2,当前集合为:\{2, 3\}.

操作6询问集合中的最小异或对,当前选取两个元素的合法方案有(2, 3),所以最小异或对的值为2\oplus 3 = 1.