아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

비트 연산 구간 질의

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

요약
배열에 구간 AND와 OR 갱신을 반복하고 구간 최솟값을 묻는 질의에 답한다. n은 5*10^5까지이고 값은 2^30 미만이다.
난이도

어려움10점 중 9점

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

문제

크기 nn인 배열 aa가 주어지고, 이 배열에 mm개의 질의를 수행해야 한다. 질의는 세 가지 종류가 있다.

  1. "& ll rr xx": 모든 i=l,l+1,…,ri = l, l+1, \ldots, r에 대해 aia_i를 (aia_i AND xx)로 바꾼다.
  2. "| ll rr xx": 모든 i=l,l+1,…,ri = l, l+1, \ldots, r에 대해 aia_i를 (aia_i OR xx)로 바꾼다.
  3. "? ll rr": al,al+1,…,ara_l, a_{l+1}, \ldots, a_r 가운데 최솟값을 구한다.

세 번째 종류의 질의에 대한 답을 모두 출력한다.

입력

첫째 줄에 정수 nn (1≤n≤5⋅1051 \le n \le 5 \cdot 10^5)이 주어진다. 이는 배열의 크기이다.

둘째 줄에 nn개의 정수 aia_i (0≤ai<2300 \le a_i < 2^{30})가 공백으로 구분되어 주어진다. 이는 배열의 원소이다.

셋째 줄에 정수 mm (1≤m≤2⋅1051 \le m \le 2 \cdot 10^5)이 주어진다. 이는 질의의 수이다.

다음 mm개의 줄에 위에서 설명한 형식으로 질의가 주어진다. 모든 질의에 대해 1≤l≤r≤n1 \le l \le r \le n이고, 첫 번째와 두 번째 종류의 질의에 대해 0≤x<2300 \le x < 2^{30}이다.

출력

세 번째 종류의 질의마다 답을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    5
    1 2 3 4 5
    4
    & 1 2 6
    | 3 5 4
    ? 1 2
    ? 3 5
    
    예상 출력
    0
    4