아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

덧셈 로봇

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

요약
이진 문자열에서 구간 뒤집기 갱신을 처리하면서, 구간의 A/B 연산을 두 수의 쌍에 적용한 결과를 10^9+7로 나눈 나머지로 답한다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 행렬, 분할 정복, 구현
정답자
아직 제출이 없습니다

문제

여러 번 두 수를 더하는 일은 시간이 많이 걸리므로, 로봇을 하나 만들려고 한다. 로봇의 메모리에는 덧셈 명령을 나타내는 길이 NN의 문자열 S=S1S2…SNS = S_1S_2\ldots S_N이 들어 있다. 문자열의 각 문자 SiS_i는 'A' 또는 'B'이다.

로봇에 QQ개의 명령을 내릴 수 있으며, 각 명령은 다음 두 종류 중 하나이다.

  • 1 L R. 로봇은 L≤i≤RL \le i \le R인 모든 문자 SiS_i를 뒤집는다. 문자를 뒤집는다는 것은 'B'였으면 'A'로, 'A'였으면 'B'로 바꾸는 것이다.
  • 2 L R A B. 로봇은 f(L,R,A,B)f(L, R, A, B)를 호출하고, 아래 의사코드에 정의된 두 정수를 반환한다.
    function f(L, R, A, B):
      FOR i from L to R
        if S[i] = 'A'
          A = A + B
        else
          B = A + B
      return (A, B)
    

로봇이 기대대로 동작하도록 구현하라.

입력

첫 줄에 두 정수 NN과 QQ가 주어진다. (1≤N,Q≤100 0001 \le N, Q \le 100\,000) NN은 로봇 메모리 속 문자의 수, QQ는 명령의 수이다. 다음 줄에는 로봇 메모리의 초기 문자열을 나타내는 길이 NN의 문자열 SS가 주어진다. 각 문자는 'A' 또는 'B'이다. 다음 QQ개 줄에는 다음 형태의 명령이 하나씩 주어진다.

  • 1 L R (1≤L≤R≤N1 \le L \le R \le N)
  • 2 L R A B (1≤L≤R≤N1 \le L \le R \le N; 0≤A,B≤1090 \le A, B \le 10^9)

두 번째 종류의 명령이 적어도 하나 주어진다.

출력

두 번째 종류의 명령마다 입력 순서대로, f(L,R,A,B)f(L, R, A, B)가 반환하는 AA와 BB의 값을 한 줄에 공백 하나로 구분해 출력한다. 출력값이 클 수 있으므로 1 000 000 0071\,000\,000\,007로 나눈 나머지를 출력한다.

힌트

첫 번째 명령에서 f(L,R,A,B)f(L, R, A, B)를 호출하면 다음과 같이 진행된다.

  • 처음에 A=1A = 1, B=1B = 1이다.
  • i=1i = 1이 끝나면 A=2A = 2, B=1B = 1이다.
  • i=2i = 2가 끝나면 A=2A = 2, B=3B = 3이다.
  • i=3i = 3이 끝나면 A=5A = 5, B=3B = 3이다.
  • i=4i = 4가 끝나면 A=8A = 8, B=3B = 3이다.
  • i=5i = 5가 끝나면 A=11A = 11, B=3B = 3이다.

따라서 f(L,R,A,B)f(L, R, A, B)는 (11,3)(11, 3)을 반환한다.

두 번째 명령이 끝나면 문자열 SS는 "ABBBB"가 된다.

세 번째 명령에서는 AA의 값이 항상 0이고 BB의 값이 항상 1 000 000 0001\,000\,000\,000이다. 따라서 f(L,R,A,B)f(L, R, A, B)는 (0,1 000 000 000)(0, 1\,000\,000\,000)을 반환한다.

예제1

  1. 예제 1

    입력
    5 3
    ABAAA
    2 1 5 1 1
    1 3 5
    2 2 5 0 1000000000
    
    예상 출력
    11 3
    0 1000000000