Pagini recente » Cod sursa (job #2289715) | Cod sursa (job #1590037) | Cod sursa (job #1042960) | Cod sursa (job #39833) | Cod sursa (job #2908843)
#include <bits/stdc++.h>
#include <bits/extc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
using namespace __gnu_pbds;
ifstream fin("elmaj.in");
ofstream fout("elmaj.out");
const int error_message = -1;
const int INSERT = 1;
const int ERASE = 2;
const int QUERY = 3;
struct Query {
int TYPE;
int value;
};
vector<Query> Queries;
template<typename T>
using Tree = tree<T, null_type, less_equal<T>,
rb_tree_tag, tree_order_statistics_node_update>;
Tree<int> DS;
map<int, int> freq;
void Insert(int value) {
freq[value]++;
DS.insert(value);
}
void Erase(int value) {
assert(freq[value] > 0);
freq[value]--;
DS.erase(DS.upper_bound(value));
}
int MajorityQuery() {
int value = *DS.find_by_order(DS.size() / 2);
// for(const auto &x: DS) {
// cout << x << " ";
// }
// cout << '\n';
if(freq[value] > DS.size() / 2) {
return value;
}
return error_message;
}
int main() {
int Q;
fin >> Q;
Queries = vector<Query> (Q);
for(auto &q: Queries) {
int TYPE = 1, value;
fin >> value;
q = {TYPE, value};
}
Queries.push_back({3, 0});
for(const auto &q: Queries) {
if(q.TYPE == 1) {
Insert(q.value);
} else if(q.TYPE == 2) {
Erase(q.value);
} else {
fout << MajorityQuery() << " " << freq[MajorityQuery()] << '\n';
}
}
return 0;
}