#P1104. 程序员对决
程序员对决
题目描述
某编程社区举办了一场代码对决大赛。参赛者分为两派:简洁派和高效派。每个参赛程序员有两个属性:代码行数 L 和 功力值 P。
若有多个最优的行数上限 使得消耗总功力达到最大值,输出其中最小的 。
大赛规则如下:
-
设定一个行数上限 T( 只需取所有参赛者中出现过的代码行数 中的值即可,无需考虑其他值; 退赛者对应的 L 在统计时不再纳入考虑)。
-
简洁派程序员仅当自己的代码行数 时可以出战。
-
高效派程序员仅当自己的代码行数 时可以出战。 (若 ,则该程序员同时计入两派的统计范围。)
-
双方出战的程序员各自按代码行数排序:简洁派从少到多,高效派从多到少(行数相同时功力值大的在前)。
-
对决开始:双方第一位出战,消耗相同功力值(消耗 ),功力少者退场,胜者继续与对方下一位对决。重复直至一方无人可战。
总消耗功力值 = ,即 。
比赛报名阶段,程序员会动态报名和退赛。你需要对每一次报名/退赛事件后,立即计算出能使消耗总功力最大的行数上限 ,以及该 下的消耗总功力值。若对于任意 ,都无法使双方均有程序员出战,输出 。
输入格式
第一行一个整数 ,表示报名/退赛事件总数。
接下来 行,每行为以下两种格式之一:
-
:报名事件。 表示简洁派, 表示高效派, 为代码行数, 为功力值。
-
:退赛事件。撤销第 条报名信息。保证第 条报名信息存在且未被撤销过。事件编号中只统计报名事件(1 操作),不计入退赛事件(2 操作)。
输出格式
对每个事件输出一行:
-
如果存在某个 使得双方均有程序员出战(消耗总功力 > 0),输出两个整数:最优行数 和最大消耗总功力。
-
否则输出 。
样例
5
1 0 3 5
1 1 5 3
2 1
1 0 4 2
2 3
Peace
3 6
Peace
4 4
Peace
提示
- T 只需在当前活跃的所有 L 值中考虑,坐标压缩时需保留可能出现的所有 L 值。
- 退赛操作 2 k 中的 k 指第 k 条报名信息(1-indexed),而非所有事件的总序号。
- 保证 2 k 中的 k 合法且未被退赛过。