만드는 중입니다

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

정렬 환상

시간 제한2초메모리 제한512 MB

요약
a[i] xor b가 비내림차순이 되게 하는 가장 작은 b를 구하고, 원소를 바꿀 때마다 답을 다시 계산한다.
난이도

어려움10점 중 8점

유형
비트 연산, 분할 정복, 세그먼트 트리, 정렬
정답자
아직 제출이 없습니다

문제

한 저명한 프로그래머가 마술사에 도전한다. 그의 대표 마술은 다음과 같다.

nn개의 음이 아닌 정수 a1,a2,…,ana_1, a_2, \ldots, a_n으로 이루어진 배열이 주어지면, 그는 마법의 수 bb를 재빨리 찾아낸다. 음이 아닌 정수 bb가 배열에 대해 마법의 수라는 것은, 이 수를 배열의 각 원소에 비트별 배타적 논리합 연산으로 적용했을 때 배열이 정렬된 배열로 바뀐다는 뜻이다. 다시 말해, [ (a_1 \oplus b) \leq (a_2 \oplus b) \leq \ldots \leq (a_n \oplus b), ] 여기서 ⊕\oplus는 비트별 배타적 논리합 연산이다.

마술을 더 화려하게 만들기 위해, 마법의 수를 보여준 뒤 마술사는 qq번 다음과 같은 동작을 수행한다. 그는 관객에게 배열의 원소 하나를 바꾸도록 제안하고, 그 뒤 다시 마법의 수를 보여주려 한다. 이때 프로그래머는 마술 솜씨를 너무나 갈고닦았기에 매번 가능한 한 가장 작은 마법의 수를 관객에게 보여준다. 가끔은 마술이 실패한다. 바뀐 배열에서 마법의 수를 찾을 수 없기 때문이다.

주어진 초기 배열에 대해, 그리고 원소를 바꿀 때마다, 얻어진 배열의 최소 마법의 수를 계산하거나 그러한 수가 없음을 판별하는 프로그램을 작성하라.

입력

첫째 줄에는 배열의 수 개수 nn이 주어진다 (1≤n≤1061 \leq n \leq 10^6).

둘째 줄에는 배열의 원소 a1,a2,…,ana_1, a_2, \ldots, a_n이 주어진다 (0≤ai<2300 \leq a_i < 2^{30}).

셋째 줄에는 원소를 바꾸는 횟수 qq가 주어진다 (0≤q≤1060 \leq q \leq 10^6).

다음 qq개 줄에는 각각 두 정수 pip_i와 viv_i가 주어진다. pip_i는 바꿀 원소의 번호이고 (1≤pi≤n1 \le p_i \le n), viv_i는 그 원소의 새 값이다 (0≤vi<2300 \le v_i < 2^{30}).

출력

출력에는 (q+1)(q + 1)개의 정수 b0,b1,…,bqb_0, b_1, \ldots, b_q가 한 줄에 하나씩 있어야 한다.

b0b_0은 초기 배열의 가능한 최소 마법의 수이거나, 그러한 수가 없으면 −1-1이다.

ii가 1부터 qq까지일 때 bib_i는 처음 ii번 바꾼 뒤 배열의 가능한 최소 마법의 수이거나, 그러한 수가 없으면 −1-1이다.

힌트

배타적 논리합은 ⊕\oplus 기호로 표기하는 논리 연산이며, 다음 진리표로 정의된다:

xxyyx⊕yx \oplus y
000
011
101
110

음이 아닌 정수 xx와 yy의 비트별 배타적 논리합을 정의하자. xx와 yy를 각각 이진법으로 쓰되, 필요하면 더 짧은 수의 앞에 0을 채워 길이를 같게 맞춘다. 두 정수 xx와 yy의 비트별 배타적 논리합은 x⊕yx \oplus y로도 표기하며, 이진법 표현의 각 자리가 xx와 yy의 해당 자리의 배타적 논리합인 음이 아닌 정수이다. 예를 들어 5⊕22=1012⊕101102=100112=195 \oplus 22 = 101_2 \oplus 10110_2 = 10011_2 = 19이다.

올림피아드에서 제시된 프로그래밍 언어 중 파스칼에서는 배타적 논리합을 나타내는 데 <<xor>> 연산자를 쓰고, 나머지 프로그래밍 언어에서는 <<^>> 연산자를 쓴다.

예제1

  1. 예제 1

    입력
    3
    0 1 4
    3
    2 7
    3 3
    1 4
    
    예상 출력
    0
    2
    -1
    4