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

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

뒤집기와 연속 구간

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

요약
이진 배열에서 구간 뒤집기 연산을 처리하면서, 주어진 구간 안에서 같은 값이 연속된 가장 긴 부분의 길이를 구한다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 분할 정복, 배열, 연결 리스트
정답자
아직 제출이 없습니다

문제

이진 배열은 각 원소가 0 또는 1인 배열이다. Aleka는 길이 N인 이진 배열 B를 가지고 있다. B의 원소는 1부터 N까지의 인덱스를 가진다.

Aleka는 배열을 가지고 놀 것이다. 그녀는 Q개의 질의를 차례로 수행한다. 각 질의는 다음 두 종류 중 하나이다.

  • FLIP L R: B의 인덱스 L부터 R까지(양 끝 포함)의 모든 비트를 뒤집는다. 비트를 뒤집는다는 것은 비트 값을 0에서 1로, 또는 1에서 0으로 바꾸는 것이다.
  • COMBO L R: B에서 인덱스가 L부터 R까지(양 끝 포함)인 비트만 모은 부분 배열을 B'라 하자. B'의 연속 부분 배열 중 모든 원소의 값이 같은 것의 최대 길이를 구한다.

모든 질의는 입력 순서대로 수행하며, COMBO 질의마다 그 답을 출력한다.

입력

첫째 줄에 두 정수 N Q (1 ≤ N, Q ≤ 100,000)가 주어진다. 이는 배열의 길이와 질의의 수를 나타낸다. 둘째 줄에 N개의 문자('0' 또는 '1')로 이루어진 문자열이 주어진다. 이 문자열은 이진 배열 B를 나타내며, i번째 문자는 B의 i번째 원소에 대응한다('0'은 0을, '1'은 1을 나타낸다). 다음 Q개의 줄에는 각각 세 정수 T L R (1 ≤ T ≤ 2; 1 ≤ L ≤ R ≤ N)가 주어지며 질의를 나타낸다. T = 1이면 FLIP 질의이고, 그렇지 않으면 COMBO 질의이다.

출력

COMBO 질의마다 그 답을 질의가 수행된 순서대로 출력한다.

예제1

  1. 예제 1

    입력
    5 5
    11000
    1 2 3
    2 1 5
    1 4 5
    2 1 5
    2 1 4
    
    예상 출력
    2
    3
    2