행렬과 쿼리

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

요약
행과 열을 추가하거나 제거하고 특정 원소를 바꿀 수 있는 2x2 행렬 수열에서 구간 곱을 10^9+9로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 행렬, 수학
정답자
아직 제출이 없습니다

문제

길이가 nn인 행렬로 이루어진 수열 a_1a\_1, a_2a\_2, ..., a_na\_n이 주어진다. 다음 쿼리를 수행하는 프로그램을 작성하시오. 처음에 모든 행렬은 22행 22열의 영행렬이다.

  • 11 ll rr ii jj: a_la\_l, a_l+1a\_{l+1}, ..., a_ra\_{r}를 차례대로 곱한 행렬의 ii행 jj열의 값을 10000000091000000009 (=109+9=10^9+9)로 나눈 나머지를 출력한다. 만약 차례대로 곱할 수 없다면 대신 -1을 출력한다. 곱이 존재하지만 결과 행렬의 범위를 벗어나는 입력은 주어지지 않는다. (1≤l≤r≤n 1 \leq l \leq r \leq n)
  • 22 ii: a_ia\_i의 행을 마지막에 하나 추가하고 추가된 행을 00으로 채운다. a_ia\_i의 행이 33행 미만인 경우에만 주어진다. (1≤i≤n 1 \leq i \leq n)
  • 33 ii: a_ia\_i의 마지막 행을 제거한다. a_ia\_i의 행이 22행보다 많은 경우에만 주어진다. (1≤i≤n 1 \leq i \leq n)
  • 44 ii: a_ia\_i의 열을 마지막에 하나 추가하고 추가된 열을 00으로 채운다. a_ia\_i의 열이 33열 미만인 경우에만 주어진다. (1≤i≤n 1 \leq i \leq n)
  • 55 ii: a_ia\_i의 마지막 열을 제거한다. a_ia\_i의 열이 22열보다 많은 경우에만 주어진다. (1≤i≤n 1 \leq i \leq n)
  • 66 ii jj kk vv: a_ia\_i의 jj행 kk열의 값을 vv로 변경한다. 행렬의 범위를 벗어나는 입력은 주어지지 않는다. (1≤i≤n;1≤v≤106 1 \leq i \leq n;1 \le v \le 10^6)

입력

첫 번째 줄에 행렬의 개수를 나타내는 정수 nn이 주어진다. (1≤n≤200,0001 \le n \le 200\\,000)

두 번째 줄에 주어질 쿼리의 개수를 나타내는 정수 qq가 주어진다. (1≤q≤200,0001 \le q \le 200\\,000)

세 번째 줄부터 qq개의 줄에 걸쳐 쿼리가 한 줄에 하나씩 주어진다. 11번 쿼리는 한 번 이상 주어진다.

주어지는 모든 수는 정수이다.

출력

11번 쿼리가 주어질 때마다 쿼리의 답을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    2
    15
    1 1 2 1 1
    6 1 1 1 1
    6 1 2 2 1
    6 1 1 2 1
    6 2 1 1 1
    6 2 1 2 1
    6 2 2 2 1
    1 1 2 1 2
    4 1
    1 1 2 1 2
    5 1
    2 2
    1 1 2 1 2
    3 2
    1 1 2 1 2
    
    예상 출력
    0
    2
    -1
    -1
    2