在本题中,你需要实现一个数据结构,它需要支持以下操作:
1. 插入:给定整数 x ,将数 x 插入该数据结构中。
2. 删除:将该数据结构的其中一个最小值从该数据结构中删除。
3. 加法:给定整数 x ,将该数据结构中的所有元素全部加上 x 。
对于每个操作 2 ,你需要输出被删除的值。
输入
第一行包含一个正整数 Q (2 ≤ Q ≤ 1e6) , 表示操作的次数。
接下来?
Q 行,每行将以下方的格式来描述每次操作:
- 1 x:表示题目描述中的操作 1 。
- 2:表示题目描述中的操作 2 。
- 3 x:表示题目描述中的操作 3 。
对于操作 1 和操作 3 的 x 满足 ∣x∣ ≤ 1e9 。保证每次操作 2 时该数据结构内至少有一个元素。
输出
输出包含若干行,每行有一个整数。
第 i 行的整数表示第 i 次操作 2 所删除的数的大小。
Input
13
1 1
1 1
1 2
1 3
1 4
2
3 10
2
1 1
2
1 12
2
2
Output
1
11
1
12
12
解析:
不难看出,不考虑操作 3,就是模拟一个小根堆。
对于操作 3,可以发现在集体加上某个值之后,相对位置不发生改变。
所以我们可以设置一个变量 cnt,
对于操作3 ,cnt加上x;
对于操作1 ,将x减去cnt,加入堆;
对于操作2 ,将堆顶元素加上cnt,弹出。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
priority_queue <int,vector<int>,greater<int>> q;
int cnt=0;
void solve()
{
int op;
cin>>op;
if (op==1)
{
int x;
cin>>x;
q.push(x-cnt);
}
else if (op==2)
{
cout<<q.top()+cnt<<endl;
q.pop();
}
else
{
int x;
cin>>x;
cnt +=x;
}
}
signed main()
{
ios;
int T=1;
cin>>T;
while (T--) solve();
return 0;
}