#L3146. 「APIO2019」路灯

「APIO2019」路灯

题目描述

一辆自动驾驶的出租车正在 Innopolis 的街道上行驶。该街道上有 n+1n + 1 个停车站点,它们将街道划分成了 nn 条路段。每一路段都拥有一个路灯。当第 ii 个路灯亮起,它将照亮连接第 ii 与第 i+1i + 1 个站点的路段。否则这条路段将是黑暗的。

安全起见,出租车只能在被照亮的路段上行驶。换言之,出租车能从站点 aa 出发到达站点 bb (a<b)(a < b) 的条件是:连接站点 aaa+1a + 1a+1a + 1a+2a + 2,……,b1b - 1bb 的路段都被照亮。

在经过一些意外故障或修理之后,街道上的路灯可能是亮起的,也可能是熄灭的。

现在给定 00 时刻时,街道上路灯的初始状态。之后 1,2,,q1, 2,\ldots, q 时刻,每时刻会发生下列两种事件之一:

  • toggle ii:切换第 ii 个路灯的状态。具体地说,若路灯原来亮起,则现在将熄灭;若路灯原来熄灭,则现在将亮起。
  • query aa bb:出租车部门的负责人想知道,从 00 时刻起到当前时刻,有多少个时刻满足:出租车能够从站点 aa 出发到达站点 bb

请你帮助出租车部门的负责人回答他们的问题。


输入格式

第一行包含两个整数 nnqq——表示路灯的数量与时刻数。

第二行包含一个字符串 ss 表示路灯的初始状态,sis_i1 表示第 ii 个路灯初始时亮起;sis_i0 表示第 ii 个路灯初始时熄灭。

接下来 qq 行每行描述一个时刻的事件。第 ii 行描述时刻 ii 所发生的事件:

  • toggle ii:该时刻切换了第 ii 个路灯的状态。
  • query aa bb:计算从 00 时刻起到该时刻,共有多少个时刻满足:出租车能从站点 aa 出发到达站点 bb

至少有一个时刻的事件是 query


输出格式

对于每个 query 的事件,输出一行单个整数,表示该问题的答案。


样例

样例 1

输入

5 7
11011
query 1 2
query 1 2
query 1 6
query 3 4
toggle 3
query 3 4
query 1 6

输出

1
2
0
0
1
2

说明

在这组样例中:

时刻 路灯状态 询问 答案对应的时刻
0 11011 -
1 query 11 22 1
2 1, 2
3 query 11 66
4 query 33 44
5 toggle 33 -
6 11111 query 33 44 6
7 query 11 66 6, 7

解释

  • 时刻 1:查询站点 1 到 2,只需要路灯 1 亮起,当前时刻 1 满足,共 1 个时刻。
  • 时刻 2:查询站点 1 到 2,时刻 1 和 2 都满足,共 2 个时刻。
  • 时刻 3:查询站点 1 到 6,需要路灯 1, 2, 3, 4, 5 全部亮起,但路灯 3 和 5 熄灭,无满足的时刻。
  • 时刻 4:查询站点 3 到 4,需要路灯 3 亮起,但当前路灯 3 熄灭,无满足的时刻。
  • 时刻 5:切换路灯 3 的状态,从 0 变为 1。
  • 时刻 6:查询站点 3 到 4,需要路灯 3 亮起,时刻 6 满足,共 1 个时刻。
  • 时刻 7:查询站点 1 到 6,需要路灯 1, 2, 3, 4, 5 全部亮起,时刻 6 和 7 满足,共 2 个时刻。

数据范围与提示

对于全部数据,1n,q3×1051 \le n, q \le 3 \times 10^5s=n|s| = n1in1 \le i \le n1a<bn+11 \le a < b \le n + 1

详细子任务限制与分值如下表。

子任务 附加限制 分值
1 n,q100n, q \le 100 20
2 对于所有 query aa bb 事件,满足 ba=1b - a = 1
3 对于所有 toggle ii 事件,第 ii 个路灯将被点亮
4 所有 toggle 事件都发生在第一个 query 事件之前
5 无特殊限制