행렬 쿼리

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

요약
2^n x 2^n 흰색 행렬에서 행이나 열 전체를 뒤집고 쿼리마다 4분할 가격을 구합니다.
난이도

보통10점 중 7점

유형
행렬, 수학, 비트 연산, 구현
정답자
아직 제출이 없습니다

문제

크기가 2n×2n2n \times 2n인 행렬이 주어지고, 처음에는 모든 칸이 흰색이다. 각 칸의 색은 검은색 또는 흰색이다. 행렬의 가격을 다음과 같이 정의하자.

  1. 행렬이 한 가지 색으로만 칠해져 있으면 가격은 1코인이다.
  2. 그렇지 않으면 행렬을 크기가 같은 4개의 부분 행렬로 나누고, 행렬의 가격은 부분 행렬들의 가격의 합에 1코인을 더한 값이다.

qq개의 쿼리가 주어진다. 각 쿼리는 행/열의 번호 xx를 주고, 이 행/열에 있는 모든 칸의 색을 바꾸고(흰색 칸은 검은색이 되고, 검은색 칸은 흰색이 된다) 새 행렬의 가격을 구해야 한다.

입력

첫째 줄에 두 정수 nn과 qq가 주어진다. (0≤n≤200 \le n \le 20, 1≤q≤1061 \le q \le 10^6) nn은 행렬의 크기가 2n×2n2n \times 2n임을, qq는 쿼리의 개수를 의미한다.

다음 qq개의 줄에는 각각 두 정수 tt와 xx가 주어진다. (0≤t≤10 \le t \le 1, 1≤x≤2n1 \le x \le 2n) t=0t = 0이면 xx번째 행을 바꾸고, 그렇지 않으면 xx번째 열을 바꾼다.

출력

각 쿼리마다 행렬의 가격을 출력한다.

힌트

예시에서 각 쿼리를 처리한 후 행렬은 다음과 같다.

예제1

  1. 예제 1

    입력
    2 7
    1 3
    0 2
    1 1
    1 4
    0 4
    0 3
    1 1
    
    예상 출력
    13
    17
    21
    17
    21
    17
    13