仓库日志


某仓库购入新的货物并将一部分老货物发出,这个过程会有软件对数据以日志形式保存,规则如下:

该日志记录了两类操作:

第一类操作为入库操作,以及该次入库的货物数量;

第二类操作为出库操作。

这些记录都严格按时间顺序排列。入库和出库的规则为先进后出,即每次出库操作货物为当前在仓库里所有货物中最晚入库的货物。

为了便于分析,现在加入了第三类查询操作,每次查询时输出当前仓库数量最多的货物的数量

输入

包含 N+1行:

第一行为 1 个正整数 N,对应于日志内所含操作的总数。

接下来的 N 行,分别属于以下三种格式之一:

  • 0 X :一次入库操作,正整数 X 表示该次入库的货物的数量
  • 1 :一次出库操作,(就当时而言)最后入库的货物出库
  • 2 :一次查询操作,要求分析程序输出当前仓库内数量最多的货物的数量

当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出 0。

初始时仓库状态为空。

输出

输出行数等于日志中查询操作的次数。每行为一个正整数,表示查询结果。

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
13
0 1
0 2
2
0 4
0 2
2
1
2
1
1
2
1
2
1
2
3
4
5
2
4
4
1
0

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
#include<stack>
using namespace std;

stack<int> stack1;//存储仓库货物的数量
stack<int> stack2;//存储当前仓库内数量最多的货物数量

int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int x; cin >> x;
switch (x) {
case 0://入库操作(入栈操作)
int num;
cin >> num;
stack1.push(num);
if (stack1.size() == 1) stack2.push(num);
else stack2.push(max(stack2.top(), num));
break;
case 1://出库操作(出栈操作)
if (!stack1.empty()) {
stack1.pop();
stack2.pop();
}
break;
case 2://仓库查询操作(获取栈顶元素)
if (!stack2.empty()) cout << stack2.top() << endl;
else cout << 0 << endl;
break;
}
}
return 0;
}