min-xor
시간 제한0.4초메모리 제한8 MB
삽입과 삭제가 번갈아 일어나는 집합에서 min-xor 질의마다 현재 집합에 있는 두 원소의 최소 XOR 값을 출력한다.
문제
두 정수 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개의 연산이 주어진다. 집합은 처음에 비어 있다. 각 연산은 다음 중 하나이다.
- insert(x): 정수 x를 집합에 넣는다;
- delete(x): 정수 x를 집합에서 뺀다;
- 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이다.