Vasiliy's Multiset
Author has gone out of the stories about Vasiliy, so here is just a formal task description.You are given q queries and a multiset A, initially containing only integer 0. There are three types of queries:  "+ x" — add integer x to multiset A. "- x" — erase one occurrence of integer x from multiset A. It's guaranteed that at least one x is present in the multiset A before this query. "? x" — you are given integer x and need to compute the value , i.e. the maximum value of bitwise exclusive OR (also know as XOR) of integer x and some integer y from the multiset A.Multiset is a set, where equal elements are allowed.
After first five operations multiset A contains integers 0, 8, 9, 11, 6 and 1.The answer for the sixth query is integer  — maximum among integers , , ,  and .
The first line of the input contains a single integer q (1 ≤ q ≤ 200 000) — the number of queries Vasiliy has to perform.Each of the following q lines of the input contains one of three characters '+', '-' or '?' and an integer xi (1 ≤ xi ≤ 109). It's guaranteed that there is at least one query of the third type.Note, that the integer 0 will always be present in the set A.
For each query of the type '?' print one integer — the maximum value of bitwise exclusive OR (XOR) of integer xi and some integer from the multiset A.
import sys, os, io
input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline

def binary_trie():
    (G0, G1, cnt) = ([-1], [-1], [0])
    return (G0, G1, cnt)

def insert(x, l):
    j = 0
    for i in range(l, -1, -1):
        cnt[j] += 1
        if x & pow2[i]:
            if G1[j] == -1:
                G0.append(-1)
                G1.append(-1)
                cnt.append(0)
                G1[j] = len(cnt) - 1
            j = G1[j]
        else:
            if G0[j] == -1:
                G0.append(-1)
                G1.append(-1)
                cnt.append(0)
                G0[j] = len(cnt) - 1
            j = G0[j]
    cnt[j] += 1
    return

def erase(x, l):
    j = 0
    for i in range(l, -1, -1):
        cnt[j] -= 1
        if x & pow2[i]:
            j = G1[j]
        else:
            j = G0[j]
    cnt[j] -= 1
    return

def xor_and_get_max(x, l):
    j = 0
    ans = 0
    for i in range(l, -1, -1):
        if not x & pow2[i]:
            if not G1[j] == -1 and cnt[G1[j]]:
                ans += pow2[i]
                j = G1[j]
            else:
                j = G0[j]
        elif not G0[j] == -1 and cnt[G0[j]]:
            ans += pow2[i]
            j = G0[j]
        else:
            j = G1[j]
    return ans
q = int(input())
ans = []
(G0, G1, cnt) = binary_trie()
l = 31
pow2 = [1]
for _ in range(l):
    pow2.append(2 * pow2[-1])
insert(0, l)
for _ in range(q):
    (c, x) = input().rstrip().decode().split()
    x = int(x)
    if c == '+':
        insert(x, l)
    elif c == '-':
        erase(x, l)
    else:
        ans0 = xor_and_get_max(x, l)
        ans.append(ans0)
sys.stdout.write('\n'.join(map(str, ans)))
import os, sys
from io import BytesIO, IOBase

class Node:

    def __init__(self):
        self.zero = None
        self.one = None
        self.onpath = 0

class Trie:

    def __init__(self, node):
        self.root = node

    def add(self, num):
        curr = self.root
        for bit in num:
            if bit == '1':
                if not curr.one:
                    curr.one = Node()
                curr = curr.one
            else:
                if not curr.zero:
                    curr.zero = Node()
                curr = curr.zero
            curr.onpath += 1

    def findmaxxor(self, num):
        (curr, val) = (self.root, 0)
        for i in num:
            if not curr:
                val *= 2
                continue
            z = '0' if i == '1' else '1'
            if z == '1':
                if curr.one:
                    curr = curr.one
                    val = val * 2 + 1
                else:
                    curr = curr.zero
                    val *= 2
            elif curr.zero:
                curr = curr.zero
                val = val * 2 + 1
            else:
                curr = curr.one
                val *= 2
        return val

    def __delitem__(self, num):
        curr = self.root
        for bit in num:
            if bit == '1':
                if curr.one.onpath == 1:
                    curr.one = None
                    break
                curr = curr.one
            else:
                if curr.zero.onpath == 1:
                    curr.zero = None
                    break
                curr = curr.zero
            curr.onpath -= 1

def main():
    z = Trie(Node())
    z.add('0' * 30)
    for _ in range(int(input())):
        r = input().split()
        x = bin(int(r[1]))[2:].zfill(30)
        if r[0] == '+':
            z.add(x)
        elif r[0] == '-':
            del z[x]
        else:
            print(z.findmaxxor(x))
BUFSIZE = 8192

class FastIO(IOBase):
    newlines = 0

    def __init__(self, file):
        self._fd = file.fileno()
        self.buffer = BytesIO()
        self.writable = 'x' in file.mode or 'r' not in file.mode
        self.write = self.buffer.write if self.writable else None

    def read(self):
        while True:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            if not b:
                break
            ptr = self.buffer.tell()
            (self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
        self.newlines = 0
        return self.buffer.read()

    def readline(self):
        while self.newlines == 0:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            self.newlines = b.count(b'\n') + (not b)
            ptr = self.buffer.tell()
            (self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
        self.newlines -= 1
        return self.buffer.readline()

    def flush(self):
        if self.writable:
            os.write(self._fd, self.buffer.getvalue())
            (self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

    def __init__(self, file):
        self.buffer = FastIO(file)
        self.flush = self.buffer.flush
        self.writable = self.buffer.writable
        self.write = lambda s: self.buffer.write(s.encode('ascii'))
        self.read = lambda : self.buffer.read().decode('ascii')
        self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
if __name__ == '__main__':
    main()
import os, sys
from io import BytesIO, IOBase

class Node:

    def __init__(self, val=None):
        self.val = val
        self.zero = None
        self.one = None
        self.isend = 0
        self.onpath = 0

    def __str__(self):
        return f'{self.val} {self.zero} {self.one} {self.isend}'

class Trie:

    def __init__(self, node):
        self.root = node

    def add(self, num):
        curr = self.root
        for bit in num:
            if bit == '1':
                if not curr.one:
                    curr.one = Node('1')
                curr = curr.one
            else:
                if not curr.zero:
                    curr.zero = Node('0')
                curr = curr.zero
            curr.onpath += 1
        curr.isend += 1

    def findmaxxor(self, num):
        (curr, val) = (self.root, 0)
        for i in num:
            if not curr:
                val *= 2
                continue
            z = '0' if i == '1' else '1'
            if z == '1':
                if curr.one:
                    curr = curr.one
                    val = val * 2 + 1
                else:
                    curr = curr.zero
                    val *= 2
            elif curr.zero:
                curr = curr.zero
                val = val * 2 + 1
            else:
                curr = curr.one
                val *= 2
        return val

    def __delitem__(self, num):
        curr = self.root
        for bit in num:
            if bit == '1':
                if curr.one.onpath == 1:
                    curr.one = None
                    break
                curr = curr.one
            else:
                if curr.zero.onpath == 1:
                    curr.zero = None
                    break
                curr = curr.zero
            curr.onpath -= 1
        else:
            curr.isend -= 1

def main():
    z = Trie(Node())
    z.add('0' * 30)
    for _ in range(int(input())):
        r = input().split()
        x = bin(int(r[1]))[2:].zfill(30)
        if r[0] == '+':
            z.add(x)
        elif r[0] == '-':
            del z[x]
        else:
            print(z.findmaxxor(x))
BUFSIZE = 8192

class FastIO(IOBase):
    newlines = 0

    def __init__(self, file):
        self._fd = file.fileno()
        self.buffer = BytesIO()
        self.writable = 'x' in file.mode or 'r' not in file.mode
        self.write = self.buffer.write if self.writable else None

    def read(self):
        while True:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            if not b:
                break
            ptr = self.buffer.tell()
            (self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
        self.newlines = 0
        return self.buffer.read()

    def readline(self):
        while self.newlines == 0:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            self.newlines = b.count(b'\n') + (not b)
            ptr = self.buffer.tell()
            (self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr))
        self.newlines -= 1
        return self.buffer.readline()

    def flush(self):
        if self.writable:
            os.write(self._fd, self.buffer.getvalue())
            (self.buffer.truncate(0), self.buffer.seek(0))

class IOWrapper(IOBase):

    def __init__(self, file):
        self.buffer = FastIO(file)
        self.flush = self.buffer.flush
        self.writable = self.buffer.writable
        self.write = lambda s: self.buffer.write(s.encode('ascii'))
        self.read = lambda : self.buffer.read().decode('ascii')
        self.readline = lambda : self.buffer.readline().decode('ascii')
(sys.stdin, sys.stdout) = (IOWrapper(sys.stdin), IOWrapper(sys.stdout))
input = lambda : sys.stdin.readline().rstrip('\r\n')
if __name__ == '__main__':
    main()