페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#8315
서브태스크
다국어

The Best Subsequence 1초 1024MB

문제

농부 John은 길이 N (1 ≤ N ≤ 10⁹)의 이진 문자열을 가지고 있으며, 처음에는 모두 0으로 채워져 있습니다.

먼저, John은 이 문자열에 대해 M (1 ≤ M ≤ 2⋅10⁵)번의 업데이트를 순서대로 수행합니다. 각 업데이트는 l부터 r까지의 모든 문자를 뒤집습니다. 즉, 0은 1로, 1은 0으로 바뀝니다.

그 후, John은 Q (1 ≤ Q ≤ 2⋅10⁵)개의 질의를 합니다. 각 질의에서, l과 r이 주어지는 구간의 부분 문자열 내에서 k (1 ≤ k ≤ r-l+1) 길이의 부분 수열 중 사전 순으로 가장 큰 것을 구하라고 합니다. 만약 답이 이진 문자열 s₁s₂…sₖ라면, 이를 이진수로 해석했을 때의 값, 즉

∑₍i=0₎^(k -1) 2ⁱ ⋅ s₍k -i₎

를 10⁹+7로 나눈 나머지를 출력합니다.

참고로, 부분 수열은 원래 문자열에서 일부 문자(또는 아무 문자도)를 삭제하여 순서를 유지하며 얻을 수 있는 문자열입니다. 두 이진 문자열(길이가 같을 때)은, 처음으로 서로 다른 문자가 나타나는 위치에서 1인 쪽이 사전 순으로 크다고 봅니다.


입력

첫 번째 줄에 세 정수 N, M, Q가 주어집니다.

다음 M개의 줄 각각에는 두 정수 l과 r (1 ≤ l ≤ r ≤ N)이 주어지며, 이는 해당 구간의 모든 문자를 뒤집는 업데이트를 의미합니다.

그 후 Q개의 줄 각각에는 세 정수 l, r, k (1 ≤ l ≤ r ≤ N, 1 ≤ k ≤ r-l+1)가 주어지며, 질의에 대한 구간과 부분 수열의 길이를 나타냅니다.


출력

각 질의에 대해, 구간 [l, r] 내에서 선택할 수 있는 k 길이의 부분 수열 중 사전 순으로 가장 큰 것을 찾습니다.

해당 부분 수열을 이진수로 해석한 값을 10⁹+7로 나눈 나머지를 한 줄에 하나씩 출력합니다.


부분문제

번호 점수 조건
#110점

N≤10,Q≤1000

#210점

M≤10

#320점

N,Q≤1000

#430점

N≤2⋅10^5

#530점

추가 제약 조건 없음


예제1

입력
5 3 9
1 5
2 4
3 3
1 5 5
1 5 4
1 5 3
1 5 2
1 5 1
2 5 4
2 5 3
2 5 2
2 5 1
출력
21
13
7
3
1
5
5
3
1
  • 첫 번째 질의에서는 전체 구간 [1,5]에서 길이 5의 부분 수열은 "10101" 하나뿐이며, 이진수 값은 21입니다.

  • 두 번째 질의에서는 구간 [1,5]에서 길이 4의 부분 수열 중 사전 순으로 가장 큰 것은 "1101"로, 이진수 값은 13입니다.

  • 세 번째 질의에서는 길이 3의 경우 "111"이 최대이며, 값은 7입니다.

  • 나머지 질의들도 같은 방식으로 계산됩니다.


예제2

입력
9 1 1
7 9
1 8 8
출력
3

업데이트 1회에서 구간 [7,9]의 문자를 뒤집습니다. 이후 질의는 구간 [1,8]에서 길이 8의 부분 수열을 구하는데, 최종 답은 3입니다.


예제3

입력
30 1 1
1 30
1 30 30
출력
73741816

업데이트 한 번 후 전체 문자열에 대해 길이 30의 부분 수열 중 사전 순으로 가장 큰 수열을 구하며, 이진수로 해석한 값이 73741816 (모듈로 10⁹+7)입니다.


출처

USACO 2025 February Gold

역링크 공식 문제집만