만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

min-xor

시간 제한0.4초메모리 제한8 MB

요약
삽입과 삭제가 번갈아 일어나는 집합에서 min-xor 질의마다 현재 집합에 있는 두 원소의 최소 XOR 값을 출력한다.
난이도

어려움10점 중 8점

유형
트라이, 비트 연산, 트리, 동적 계획법
정답자
아직 제출이 없습니다

문제

두 정수 a와 b를 생각하자. 이들의 비트별 xor(exclusive or)는 다음과 같이 계산된다.

  • 두 수를 이진법으로 쓴다: a=ak-1ak-2...a0, b = bk-1bk-2...b0;
  • 비트별 xor a ^ b는, ap와 bp 중 정확히 하나만 1일 때에 한해 p번째 비트가 1이다.

예를 들어 9 ^ 3 = 10인데, 9 = 1001(2), 3 = 0011(2)이고 10 = 1010(2)이기 때문이다.

정수 집합에 대한 N개의 연산이 주어진다. 집합은 처음에 비어 있다. 각 연산은 다음 중 하나이다.

  1. insert(x): 정수 x를 집합에 넣는다;
  2. delete(x): 정수 x를 집합에서 뺀다;
  3. min-xor(): 현재 집합에 있는 두 정수 사이의 비트별 xor 중 가장 작은 값을 출력한다.

모든 min-xor() 연산의 출력을 인쇄해야 한다.

입력

첫째 줄에 연산의 개수 N이 주어진다. 다음 N개의 줄에 각각 하나의 연산이 다음 형식으로 주어진다.

  • 1 x: insert(x)
  • 2 x: delete(x)
  • 3: min-xor()

출력

출력은 min-xor() 연산의 개수와 같은 수의 줄로 이루어진다. 각 줄에는 해당 min-xor() 연산의 답을 하나씩 출력한다.

제한

  • 1 ≤ N ≤ 100,000;
  • 모든 insert(x)와 delete(x) 연산에서 1 ≤ x ≤ 1,000,000,000;
  • 모든 insert(x) 연산에서 x는 집합에 존재하지 않음이 보장된다;
  • 모든 delete(x) 연산에서 x는 집합에 존재함이 보장된다;
  • 모든 min-xor() 연산에서 집합의 원소가 2개 이상임이 보장된다;

힌트

첫 번째 min-xor()에서 집합은 {24, 17}이다. 최소 비트별 xor는 24 ^ 17 = 9이다.

두 번째 min-xor()에서 집합은 {24, 17, 23, 30}이다. 최소 비트별 xor는 24 ^ 30 = 6이다(17 ^ 23 = 6도 같다).

세 번째 min-xor()에서 집합은 {24, 23, 30}이다. 최소 비트별 xor는 24 ^ 30 = 6이다.

마지막 min-xor()에서 집합은 {24, 23}이다. 최소 비트별 xor는 24 ^ 23 = 15이다.

예제1

  1. 예제 1

    입력
    10
    1 24
    1 17
    3
    1 23
    1 30
    3
    2 17
    3
    2 30
    3
    
    예상 출력
    9
    6
    6
    15