import Data.Bits (Bits (shiftL, shiftR, testBit, xor, (.|.)))
import Data.Char (digitToInt)
data Trie = Trie0 | Trie1 | TrieNode Bool Int Trie Trie
instance Show Trie where show = show . trieValue
trieFind :: Trie -> Int
trieFind Trie0 = 0
trieFind Trie1 = 1
trieFind (TrieNode b _ _ _) = fromEnum b
trieFoo :: Trie -> String -> Trie
trieFoo trie ('1' : _) = trieSucc trie
trieFoo trie ('2' : x) = trieInsert trie (trieRead 0 x)
trieFoo _ _ = undefined
trieInsert :: Trie -> Int -> Trie
trieInsert Trie0 0 = Trie1
trieInsert Trie1 0 = Trie0
trieInsert (TrieNode b i t0 t1) x
| x == 0 = TrieNode b' i (trieInsert t0 0) t1
| testBit x 0 = TrieNode b' i' t0 (trieInsert t1 x')
| otherwise = TrieNode b' i' (trieInsert t0 x') t1
where
b' = not b
i' = xor i x
x' = shiftR x 1
trieInsert Trie0 x = trieInsert (TrieNode False 0 Trie0 Trie0) x
trieInsert Trie1 x = trieInsert (TrieNode True 0 Trie1 Trie0) x
trieRead :: Int -> String -> Int
trieRead i [] = i
trieRead i (' ' : s) = trieRead i s
trieRead i ('\r' : s) = trieRead i s
trieRead i (c : s) = trieRead (i * 10 + digitToInt c) s
trieSucc :: Trie -> Trie
trieSucc Trie0 = Trie0
trieSucc Trie1 = TrieNode True 1 Trie0 Trie1
trieSucc (TrieNode b i t0 t1) = TrieNode b i' t1' t0
where
i' = shiftL (trieValue t0 `xor` trieValue t1') 1 .|. trieFind t0
t1' = trieSucc t1
trieValue :: Trie -> Int
trieValue (TrieNode _ i _ _) = i
trieValue _ = 0
main :: IO ()
main = do
n <- getLine
c <- getContents
putStr . unlines . map show . tail . scanl trieFoo Trie0 . take (read n) $ lines c