만드는 중입니다

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

알파벳과 쿼리 (Hard)

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

요약
대문자 문자열에서 부분 문자열 안의 같은 글자 연속 구간 수를 세고, 구간의 글자를 다음 알파벳으로 바꾸는 쿼리를 처리합니다.
난이도

보통10점 중 6점

유형
세그먼트 트리, 문자열
정답자
아직 제출이 없습니다

문제

Easy 버전과 비교하면 NN, QQ의 제한만 다르고 나머지는 같다.

아래 두 조건을 만족하는 부분 문자열을 알파벳 묶음이라고 하자.

  • 하나의 동일한 알파벳으로만 문자열이 이루어져 있어야 한다.
  • 전체 문자열에서 해당 부분 문자열을 포함하는 더 긴 부분 문자열로 알파벳 묶음을 만들 수 있으면 그 부분 문자열은 알파벳 묶음이 아니다.

예를 들어 AAABBAAC라는 문자열에서 알파벳 묶음은 AAA, BB, AA, C로 4개다. 같은 문자열에서 B, AC는 조건을 만족하지 않으므로 알파벳 묶음이 아니다.

영어 대문자로만 이루어진 길이 NN의 문자열 S=S1S2…SNS = S_1 S_2 \dots S_N이 주어진다. 다음 쿼리를 처리하는 프로그램을 작성하라.

  • 1 l r: 부분 문자열 SlSl+1…SrS_l S_{l+1} \dots S_r에서 알파벳 묶음의 개수를 출력한다.
  • 2 l r: 부분 문자열 SlSl+1…SrS_l S_{l+1} \dots S_r의 모든 알파벳을 알파벳 순서상 다음 알파벳으로 바꾼다. 단, Z는 A로 바꾼다.

부분 문자열 SlSl+1…SrS_l S_{l+1} \dots S_r은 SS의 ll번째 문자부터 rr번째 문자까지를 순서대로 포함하는 부분 문자열이다.

입력

첫 번째 줄에 문자열의 길이 NN과 쿼리의 개수 QQ가 공백으로 구분되어 주어진다. (3≤N,Q≤200 000)(3 \leq N, Q \leq 200 \ 000)

두 번째 줄에 영어 대문자로만 이루어진 길이 NN의 문자열 SS가 주어진다.

세 번째 줄부터 QQ개의 줄에 걸쳐 쿼리가 한 줄에 하나씩 주어진다. (1≤l≤r≤N)(1 \leq l \leq r \leq N)

1번 쿼리는 한 번 이상 주어진다.

출력

1번 쿼리의 결괏값을 입력으로 주어진 순서대로 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    8 5
    AAABBAAC
    1 3 8
    2 2 7
    1 1 8
    2 6 7
    1 1 8
    
    예상 출력
    4
    5
    3