#6572. 圣诞老人的灯(Светилките на Дедо Мраз)

圣诞老人的灯(Светилките на Дедо Мраз)

题目名称:圣诞老人的灯(Светилките на Дедо Мраз)

来源:马其顿编程竞赛(Macedonian Programming Contests)

题目背景

三个小矮人正在装饰圣诞老人的院子。

  1. 马丁(Martin):首先放置了 NN 盏灯,每盏灯的状态为 AiA_i(1 表示开,0 表示关)。
  2. 阿尔廷(Altin):想要更多的灯亮着。他会执行操作 + A B,将区间 [A,B][A, B] 内的所有灯全部开启
  3. 蒂雅娜(Tijana):想要更少的灯亮着。她会执行操作 - A B,将区间 [A,B][A, B] 内的所有灯全部关闭
  4. 马丁的任务:他关心某个特定区间内亮着的灯的总数。他会提出问题 ? A B

你的任务是模拟这些操作并回答马丁的提问。

输入格式

  • 第一行:两个整数 NN(灯的数量,1N100,0001 \le N \le 100,000)和 QQ(操作次数,1Q100,0001 \le Q \le 100,000)。
  • 第二行:NN 个数字(0 或 1),表示灯的初始状态。
  • 接下来的 QQ 行:操作指令。
    • + A B:将区间 [A,B][A, B] 内的灯全部设为 1。
    • - A B:将区间 [A,B][A, B] 内的灯全部设为 0。
    • ? A B:查询区间 [A,B][A, B] 内状态为 1 的灯的数量。

输出格式

  • 对每个 ? 查询,输出一个整数。

限制要求

  • 时间限制:1.0 秒
  • 内存限制:64 MB(注意:线段树需要合理分配空间,避免超限)

样例分析

输入:

7 6
0 0 0 1 1 1 1
? 2 6
- 5 6
? 3 7
+ 2 5
- 3 6
? 1 4

执行过程:

  1. 初始状态:[0, 0, 0, 1, 1, 1, 1]
  2. ? 2 6:区间 [2, 6] 有 3 个 1。输出 3
  3. - 5 6:状态变为 [0, 0, 0, 1, 0, 0, 1]
  4. ? 3 7:区间 [3, 7] 有 2 个 1(第 4 和第 7 位)。输出 2
  5. + 2 5:状态变为 [0, 1, 1, 1, 1, 0, 1]
  6. - 3 6:状态变为 [0, 1, 0, 0, 0, 0, 1]
  7. ? 1 4:区间 [1, 4] 只有第 2 位是 1。输出 1


版权信息:整理自马其顿青少年编程竞赛(Macedonian Programming Contests)。版权归原赛事组委会所有。