#sZSZybttg040104. 1538:清点人数

1538:清点人数

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

NK 中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去。由于 NK 中学的学生很多,在火车开之前必须清点好人数。

初始时,火车上没有学生。当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第 mm 节车厢时,他想知道前 mm 节车厢上一共有多少学生,但是他没有调头往回走的习惯。也就是说每次当他提问时,mm 总会比前一次大。


输入格式

第一行两个整数 n,kn, k,表示火车共有 nn 节车厢以及 kk 个事件。

接下来 kk 行,按时间先后给出 kk 个事件,每行开头都有一个字母 ABC

  • 如果字母为 A,接下来是一个整数 mm,表示年级主任现在在第 mm 节车厢,需要输出前 mm 节车厢的总人数;
  • 如果字母为 B,接下来是两个整数 m,pm, p,表示在第 mm 节车厢有 pp 名学生上车;
  • 如果字母为 C,接下来是两个整数 m,pm, p,表示在第 mm 节车厢有 pp 名学生下车。

保证学生总人数不会超过 10510^5


输出格式

对于每个 A 事件,输出一行一个整数,表示前 mm 节车厢的学生总数。


样例

样例输入

10 7
A 1
B 1 1
B 3 1
B 4 1
A 2
A 3
A 10

样例输出

0
1
2
3

样例解释

初始所有车厢人数为 00

  1. A 1:询问前 11 节车厢人数,此时没有学生,输出 00
  2. B 1 1:在第 11 节车厢上车 11 人,第 11 节车厢人数变为 11
  3. B 3 1:在第 33 节车厢上车 11 人,第 33 节车厢人数变为 11
  4. B 4 1:在第 44 节车厢上车 11 人,第 44 节车厢人数变为 11
  5. A 2:询问前 22 节车厢人数,只有第 11 节有 11 人,输出 11
  6. A 3:询问前 33 节车厢人数,第 1111 人,第 3311 人,共 22 人,输出 22
  7. A 10:询问前 1010 节车厢人数,第 1111 人,第 3311 人,第 4411 人,共 33 人,输出 33

数据范围

  • 对于 30%30\% 的数据,1n,k1041 \le n, k \le 10^4,至少有 30003000A 事件;
  • 对于 100%100\% 的数据,1n5×105,1k1051 \le n \le 5\times 10^5, 1 \le k \le 10^5,至少有 3×1043\times 10^4A 事件。

时空限制

  • 时间:200 ms200 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}(512 MB)

提示
此题为 单点修改、前缀和查询 问题,由于 nnkk 较大,需要 O(logn)O(\log n) 的修改与查询。

方法:使用 树状数组(Fenwick Tree) 维护每节车厢的人数,支持:

  • 单点加/减(上车/下车);
  • 前缀和查询(前 mm 节车厢总人数)。

步骤

  1. 初始化一个长度为 n+1n+1 的树状数组(下标从 11 开始),全部为 00
  2. 读入每个事件:
    • 若为 B m p:在位置 mm 加上 ppadd(m, p));
    • 若为 C m p:在位置 mm 减去 ppadd(m, -p));
    • 若为 A m:输出前缀和 sum(m)
  3. 由于询问的 mm 单调递增,也可以直接维护前缀和变量,但因为有修改,不能简单累加,树状数组仍然必要。

复杂度:每个事件 O(logn)O(\log n),总复杂度 O(klogn)O(k \log n),可以接受。

注意

  • 题目保证 A 事件的 mm 单调递增,但这不是解题必要条件,树状数组本身支持任意顺序的查询;
  • 学生总人数不超过 10510^5,但 nn 可达 5×1055\times 10^5,树状数组大小应为 n+1n+1
  • 输入输出量较大,建议使用 scanf/printf 或关闭同步的 cin/cout