만드는 중입니다

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

XOR 쿼리

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

요약
배열에 원소를 추가하고 마지막 k개를 삭제하는 연산과 함께, 구간에서 x와의 XOR이 최대인 값, x 이하의 개수, k번째 작은 값을 구한다.
난이도

어려움10점 중 9점

유형
트라이, 세그먼트 트리, 이분 탐색, 누적 합
정답자
아직 제출이 없습니다

문제

배열 AA는 처음에 비어 있다. 다음 다섯 가지 쿼리를 입력에 주어진 순서대로 처리하는 프로그램을 작성한다. 배열의 인덱스는 1부터 시작한다.

  • 1 x: AA의 끝에 xx를 추가한다.
  • 2 L R x: AA의 LL번째 원소부터 RR번째 원소까지 중에서 xx와 xor한 값이 가장 큰 원소 yy를 출력한다. 서로 다른 두 값은 xx와 xor한 결과도 서로 다르므로 이런 yy는 하나로 정해진다.
  • 3 k: AA의 마지막 kk개 원소를 제거한다.
  • 4 L R x: AA의 LL번째 원소부터 RR번째 원소까지 중에서 xx보다 작거나 같은 원소의 개수를 출력한다.
  • 5 L R k: AA의 LL번째 원소부터 RR번째 원소까지 중에서 kk번째로 작은 수를 출력한다. 같은 값이 여러 번 나오면 나온 횟수만큼 세어 순위를 매긴다.

입력

첫째 줄에 쿼리의 개수 MM (1≤M≤500,0001 \le M \le 500{,}000)이 주어진다.

둘째 줄부터 MM개의 줄에 쿼리가 한 줄에 하나씩 주어진다. 1번, 2번, 4번 쿼리의 xx는 1≤x≤500,0001 \le x \le 500{,}000을 만족한다.

각 쿼리를 실행하기 직전 AA의 길이를 NN이라고 하면, 2번, 4번, 5번 쿼리는 1≤L≤R≤N1 \le L \le R \le N을 만족하고 3번 쿼리는 1≤k≤N1 \le k \le N을 만족한다. 5번 쿼리의 kk는 k≤R−L+1k \le R-L+1도 만족한다.

출력

2번, 4번, 5번 쿼리의 답을 입력에 주어진 순서대로 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    10
    1 8
    5 1 1 1
    1 2
    2 2 2 7
    2 2 2 7
    1 1
    4 2 2 2
    2 1 2 3
    4 1 3 5
    1 6
    
    예상 출력
    8
    2
    2
    1
    8
    2
    
  2. 예제 2

    입력
    16
    1 1
    1 2
    2 1 1 1
    2 2 2 1
    2 1 2 3
    4 1 1 1
    4 2 2 1
    4 1 2 3
    5 1 1 1
    5 2 2 1
    5 1 2 2
    3 1
    3 1
    1 1
    1 2
    3 2
    
    예상 출력
    1
    2
    1
    1
    0
    2
    1
    2
    2