만드는 중입니다

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

산술 수업

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

요약
수열의 모든 원소에 xor나 and 연산을 순서대로 적용하고, 질의마다 l 이상 r 이하인 원소의 개수를 세는 문제입니다.
난이도

보통10점 중 7점

유형
비트 연산, 트라이
정답자
아직 제출이 없습니다

문제

와칸다의 한 평범한 학교에서 오늘 산술 수업으로 정수의 비트 연산을 배웁니다.

대상 연산은 and와 xor입니다. 비트 연산은 두 수의 각 비트에 대해 독립적으로 수행됩니다. 진리표는 다음과 같습니다.

xxyyxx and yyxx xor yy
00000000
00110011
11000011
11111100

수업 시작에 선생님이 길이 nn인 수열을 칠판에 적습니다. 선생님은 학생들에게 다음 연산을 차례로 수행하라고 합니다.

  • 선생님이 수 xx를 말합니다. 학생들은 현재 수열의 모든 원소에 xor xx를 적용해 새 수열을 만듭니다.
  • 선생님이 수 xx를 말합니다. 학생들은 현재 수열의 모든 원소에 and xx를 적용해 새 수열을 만듭니다.
  • 선생님이 수 ll과 rr을 말합니다. 학생들은 현재 수열에서 ll 이상 rr 이하인 원소의 개수를 답합니다.

학생들이 선생님의 모든 질문에 올바르게 답하도록 도와주세요.

입력

첫 줄에 수열의 길이 nn과 수행할 연산의 개수 qq가 주어집니다 (1≤n≤100 0001 \le n \le 100\,000, 0≤q≤100 0000 \le q \le 100\,000). 둘째 줄에는 초기 수열의 원소 aia_i가 nn개 주어집니다 (0≤ai<2200 \le a_i < 2^{20}). 이후 qq개 줄에 연산이 한 줄씩 주어집니다.

줄이 xor로 시작하면 첫 번째 유형입니다. 같은 줄에 수 xx(0≤x<2200 \le x < 2^{20})가 주어지고, 현재 수열의 모든 원소 curicur_i를 curicur_i xor xx 값으로 바꿉니다.

줄이 and로 시작하면 두 번째 유형입니다. 같은 줄에 수 xx(0≤x<2200 \le x < 2^{20})가 주어지고, 모든 원소 curicur_i를 curicur_i and xx 값으로 바꿉니다.

줄이 ?로 시작하면 세 번째 유형입니다. 같은 줄에 정수 ll과 rr(0≤l≤r<2200 \le l \le r < 2^{20})이 주어지고, l≤curi≤rl \le cur_i \le r을 만족하는 현재 수열의 원소 curicur_i의 개수를 구합니다.

출력

세 번째 유형의 각 연산에 대해 답을 새 줄에 출력합니다.

힌트

첫 번째 테스트에 대한 설명입니다.

xor 1 연산 후 수열은 00, 33, 22, 55, 44가 됩니다.

and 2 연산 후 수열은 00, 22, 22, 00, 00이 됩니다.

예제1

  1. 예제 1

    입력
    5 5
    1 2 3 4 5
    ? 3 4
    xor 1
    ? 1 2
    and 2
    ? 1 3
    
    예상 출력
    2
    1
    2