[R63F]这是一个01串题3 - 代码源竞赛平台

时空限制

1S/512M

题目描述

给定一个长度为 nn 的 0101 串 ss。

定义一个字符串是“错列串”,当且仅当任意两个相邻字符都不同。例如 10101、0101 是错列串,而 110、00 不是。

一次操作可以选择字符串中相邻的两个字符并交换它们。

定义 h(T)h(T) 为:将字符串 TT 变成错列串所需的最少操作次数。若无论如何交换都无法变成错列串,则 h(T)=−1h(T) = -1。

现在给出 QQ 个询问,每次给定区间 [l,r][l, r],求 h(s[l,r])h(s[l, r])。

格式

输入格式

第一行包含两个正整数 nn 和 QQ,分别表示字符串的长度和询问的个数。

第二行包含一个长度为 nn 的 0101 串 ss。

接下来 QQ 行,每行包含两个正整数 ll 和 rr(1≤l≤r≤n1 \le l \le r \le n),表示询问的区间。

输出格式

输出共 QQ 行,每行包含一个整数,表示对应询问的答案。

样例

样例输入 #1

5 4
01100
1 5
2 3
1 4
3 5

样例输出 #1

1
-1
1
1

样例解释 #1

  • 对于第一个询问 [1,5][1, 5],s[1,5]=s[1, 5] = 01100。它的字符构成为 33 个 0 和 22 个 1。我们可以交换第 33 个和第 44 个字符,得到错列串 01010,只需 11 次操作,因此答案为 11。
  • 对于第二个询问 [2,3][2, 3],s[2,3]=s[2, 3] = 11。无论如何交换也无法变成错列串,因此答案为 −1-1。
  • 对于第三个询问 [1,4][1, 4],s[1,4]=s[1, 4] = 0110。可以交换第 11 个和第 22 个字符(得到 1010),或交换第 33 个和第 44 个字符(得到 0101),最少操作次数为 11。
  • 对于第四个询问 [3,5][3, 5],s[3,5]=s[3, 5] = 100。可以交换第 11 个和第 22 个字符,得到 010,最少操作次数为 11。

数据规模

注意:你只有通过了子任务的所有测试点,才能获得对应子任务的分数。

子任务编号 分数 n≤n\le Q≤Q\le
11 3030 100100
22 3030 20002000
33 4040 2×1052\times 10^5

对于 100%100\% 的数据,1≤n,Q≤2×1051 \le n, Q \le 2 \times 10^5,ss 中仅包含字符 0 和 1,1≤l≤r≤n1 \le l \le r \le n。