XOR 쿼리

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

어려움9트라이세그먼트 트리이분 탐색누적 합아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

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

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

입력

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

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

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

출력

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