人们通常会成群结队地去游乐园。但是,当轮到他们乘坐游乐设施时,如果发现座位不足以容纳所有人,会发生什么呢?有些团体愿意拆分,而有些则不愿意。
Stuart 蜗牛负责管理热门游乐设施前的排队队列。团体按顺序排队等待乘坐。在登乘期间,Stuart 首先会收到可以容纳的座位总数。然后,他从队首开始,依次询问队列中的每个团体。他会告诉该团体剩余的座位数,并询问他们是否愿意登乘。团体根据以下规则做出决定:
- 如果剩余座位足够容纳整个团体,该团体将一起登乘。
- 否则,如果该团体愿意拆分,他们会派出足够的人数填满剩余的座位,而其余成员则留在队列中的原位。
- 否则,整个团体将一起留在队列中的原位。
在此过程中,最终可能并非所有可用座位都被填满。无论如何,成功登乘的人们将享受游乐设施,并在结束后离开,不会重新加入队列。
不幸的是,对于像 Stuart 这样的蜗牛来说,这个过程非常耗时,因为它需要反复沿着队列移动。请编写一个程序来跟踪队列的状态,并快速确定哪些团体应该在必要时拆分并登乘。具体来说,它应该支持以下三种操作:
join:一个团体加入队列末尾。- 给定一个整数 $s$,表示团体的大小。
- 给定一个整数 $w$,其值为 $0$ 或 $1$。如果 $w = 0$,则该团体不愿意拆分。否则,如果 $w = 1$,则该团体愿意拆分。你可以假设一个团体的拆分意愿永远不会改变。
- 假设这是第 $i$ 次
join操作,则该团体被分配 ID $i$,其中 $i$ 从 $1$ 开始计数。
leave:一个团体在不登乘的情况下离开队列。- 给定一个整数 $i$,表示离开队列的团体 ID。
- 保证该团体在队列中。如果该团体愿意拆分,则其部分成员可能已经登乘并离开了。
board:允许一些人根据规则登乘。- 给定一个整数 $b$,表示在此期间最多可以登乘的人数。
- 你需要决定每个团体有多少人登乘。有关更多信息,请参阅“输出格式”部分。
输入格式
你的程序必须从标准输入读取数据。
注意,输入中的某些值可能无法用 32 位整数表示。
输入的第一行包含一个整数 $q$,表示 join、leave 和 board 操作的总数。
接下来的 $q$ 行,每行包含两个或三个整数,遵循以下三种格式之一:
1 s w:描述一个join操作;2 i:描述一个leave操作;3 b:描述一个board操作。
输出格式
你的程序必须输出到标准输出。
对于 join 和 leave 操作,不要输出任何内容。
对于每次 board 操作,令 $k$ 为至少有一人登乘的团体数量。你应该输出 $k + 1$ 行,具体如下:
- 第一行应仅包含整数 $k$。
- 如果 $k > 0$,则接下来的 $k$ 行,每行应包含两个整数。第一个是团体 ID,第二个是该团体中登乘的人数。你应该按团体 ID 递增的顺序输出这 $k$ 行。(如果 $k = 0$,你可以忽略此部分。)
数据范围
对于所有测试用例,输入满足以下限制:
- $1 \le q \le 200\,000$
- 对于所有
join操作,$1 \le s \le 200\,000$ 且 $0 \le w \le 1$ - 对于所有
leave操作,ID 为 $i$ 的团体在操作时一定在队列中 - 对于所有
board操作,$1 \le b \le 10^{12}$ - 至少有一次
board操作
你的程序将在满足以下限制的输入实例上进行测试:
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 0 | 0 | 样例测试 |
| 1 | 12 | $q \le 1000$ |
| 2 | 7 | $s = 1, w = 0$,没有 leave 操作 |
| 3 | 20 | $s \le 10, w = 0$,没有 leave 操作 |
| 4 | 16 | $s \le 10$,没有 leave 操作 |
| 5 | 10 | $s \le 10$ |
| 6 | 35 | 无附加限制 |
样例
样例输入 1
7 1 2 0 1 6 0 1 6 1 3 5 2 2 1 3 0 3 123456789012
样例输出 1
2 1 2 3 3 2 3 3 4 3
样例输入 2
5 1 1 0 1 1 0 1 1 0 3 2 1 1 0
样例输出 2
2 1 1 2 1
样例输入 3
4 1 19 1 3 10 3 10 3 10
样例输出 3
1 1 10 1 1 9 0