http://acm.uestc.edu.cn/#/problem/show/1339
本来想用线段树+数据离散化做,结果过不了,所以改用两个set容器,在要求的数分开保存。
#include<algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <set>
#define Max 100005
using namespace std;
queue<int>A;
set<int>big;
int op, key;
set<int> s;
void compare() {
if (s.size() < big.size() - 1 ) {
s.insert(*big.begin());
big.erase(*big.begin());
}
else if (s.size() > big.size()) {
big.insert(*s.rbegin());
s.erase(*s.rbegin());
}
}
int main() {
int N;
scanf("%d", &N);
while (N--) {
scanf("%d", &op);
switch (op) {
case 1:
scanf("%d", &key);
A.push(key);
if (big.empty() || key > *big.begin()) {
big.insert(key);
}else{
s.insert(key);
}
compare();
break;
case 2:
key = A.front();
A.pop();
if (key > *s.rbegin()) {
big.erase(big.find(key));
}
else{
s.erase(s.find(key));
}
compare();
break;
case 3:
printf("%d\n", *big.begin());
}
}
return 0;
}