思路:
压入队尾:直接压 x。
删除:判断会不会把队头删除,会删除就删除,不会就增加实际队列的队头。
查询:类似于删除,但不弹出队头。
查最大值:优先队列和 map 维护最大值及是否存在。
#17 WA 了。
#include <cstdio>
#include <stack>
#include <queue>
#include <map>
typedef long long ll;
const int MAX = 2e5+5;
int c, q, opt, x;
std::priority_queue< int > PQ;
std::map< int, int > appear;
struct Queue{
int front, tail, head;
int val[MAX];
Queue(int h = 1, int t = 0){
front = head = h;
tail = t;
}
void push(int x){
val[++tail] = x;
}
void pop(){
front++;
}
}Q;
int main(){
scanf("%d %d", &c, &q);
while(q--){
scanf("%d", &opt);
if(opt == 1){
scanf("%d", &x);
Q.push(x);
appear[x]++;
PQ.push(x);
}else if(opt == 2){
scanf("%d", &x);
//printf("2.1: %d %d\n", Q.val[Q.front], Q.head);
while(x >= Q.val[Q.front]-Q.head+1)
x -= (Q.val[Q.front]-Q.head+1), appear[Q.val[Q.front]]--, Q.pop(), Q.head = 1;
Q.head += (x);
//printf("2.2: %d %d\n", Q.val[Q.front], Q.head);
}else if(opt == 3){
scanf("%d", &x);
if(x <= Q.val[Q.front]-Q.head+1){
printf("%d\n", Q.head+x-1);
continue;
}
int p = Q.front+1;
x -= (Q.val[Q.front]-Q.head+1);
while(x > Q.val[p])
x -= Q.val[p], p++;
printf("%d\n", x);
}else if(opt == 4){
while(appear[PQ.top()] <= 0)
PQ.pop();
printf("%d\n", PQ.top()/*, appear[PQ.top()]*/);
}
}
return 0;
}