Takahashi has many balls, on which nothing is written, and one bag. Initially, the bag is empty. Takahashi will do Q operations, each of which is of one of the following three types.
For each 1≤i≤Q, you are given the type Pi of the i-th operation and the value of Xi if the operation is of Type 1 or 2. Print the integers recorded in the operations of Type 3 in order.
Input is given from Standard Input in the following format:
Q query1 query2 :: queryQ
Each queryi in the 2-nd through (Q+1)-th lines is in the following format:
1 Xi 2 Xi 3
The first number in each line is 1≤Pi≤3, representing the type of the operation. If Pi=1 or Pi=2, it is followed by a space, and then by Xi.
For each operation with Pi=3 among the Q operations, print the recorded integer in its own line.
5 1 3 1 5 3 2 2 3
3 7
Takahashi will do the following operations.
Therefore, we should print 3 and 7, in the order they are recorded.
6 1 1000000000 2 1000000000 2 1000000000 2 1000000000 2 1000000000 3
5000000000
Note that the outputs may not fit into a 32-bit integer.
3种操作。操作1:将一个数字\(X_i\)写入。操作2:所有数字加上\(X_i\)。操作3:读取并删除最小的数字
\(Q<=2*10^5,X_i<=10^9\)
要点在于如何快速维护所有当前数字\(+X_i\)
考虑对数字的增加进行全局维护,维护全局的相加和\(nowsum\),最后读取时加上\(nowsum\)表示操作2的影响
当插入一个数字时,则减去当前的\(nowsum\),即抵消掉之前的操作2的影响
每次将\(x_i-nowsum\)插入有限队列,读取时\(+nowsum\)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long ll; priority_queue<ll,vector<ll>,greater<ll> >q; ll nowsum=0; int main(){ int Q,opt,x; cin>>Q; while (Q--){ scanf("%d",&opt); if (opt==1){ scanf("%d",&x); q.push(x-nowsum); }else if (opt==2){ scanf("%d",&x); nowsum+=x; }else{ printf("%lld\n",q.top()+nowsum); q.pop(); } } }