Cod sursa(job #2908843)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 6 iunie 2022 10:30:24
Problema Elementul majoritar Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#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;
}