비트 뒤집기와 쿼리

시간 제한4초메모리 제한1024 MB

요약
현재 값이 구간에 속하는 모든 원소의 특정 비트를 뒤집는 갱신과 k번째로 작은 값 질의를 처리한다.
난이도

어려움10점 중 8점

유형
이분 탐색, 누적 합, 비트 연산, 정렬
정답자
아직 제출이 없습니다

문제

00 이상 2202^{20} 미만 정수 NN개가 주어진다. 다음 두 종류의 쿼리 QQ개를 수행하는 프로그램을 작성하시오.

  • 1 l r k: NN개의 정수 중 ll 이상 rr 이하인 모든 정수의 kk번째 비트를 뒤집는다. kk번째 비트를 뒤집는 것은 정수를 이진수로 나타냈을 때 kk번째 비트를 00이면 11로, 11이면 00으로 바꾸는 것이다. 가장 작은 자릿수의 비트가 00번째 비트이다. (0≤l≤r<220;0≤k≤19)(0 \leq l \leq r < 2^{20}; 0 \leq k \leq 19)
  • 2 k: NN개의 정수에서 중복을 포함하여 kk번째로 작은 수를 구한다. 가장 작은 수가 11번째로 작은 수이다. (1≤k≤N)(1 \leq k \leq N)

입력

첫 번째 줄에 정수 NN, QQ가 공백으로 구분하여 주어진다. (1≤N,Q≤106)(1 \leq N, Q \leq 10^6)

두 번째 줄에 NN개의 00 이상 2202^{20} 미만 정수가 공백으로 구분하여 주어진다.

세 번째 줄부터 QQ개의 쿼리가 한 줄에 하나씩 주어진다.

출력

첫 번째 줄부터 22번 쿼리가 주어질 때마다 정답을 한 줄에 하나씩 순서대로 출력한다. 22번 쿼리는 적어도 한 번 이상 주어진다.

예제2

  1. 예제 1

    입력
    5 2
    1 2 3 4 5
    1 1 1 2
    2 2
    
    예상 출력
    3
    
  2. 예제 2

    입력
    7 10
    13 11 13 5 9 11 0
    1 12 14 3
    2 3
    2 5
    1 10 12 1
    2 4
    2 6
    2 4
    1 5 7 3
    1 3 12 1
    2 3
    
    예상 출력
    5
    9
    5
    9
    5
    11