Cod sursa(job #2756702)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 2 iunie 2021 15:44:11
Problema Heapuri cu reuniune Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include<bits/stdc++.h>
#define god dimasi5eks
#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front
 
#define fisier 1
 
using namespace std;
 
typedef long long ll;
 
const int mod = 1000000007;
const double dancila = 3.14159265359; // PI 
const double eps = 1e-9;
 
int n, q;

vector<int> sets[102];
multiset<int> seturi[102];
 
pair<int, int> solve(int x)
{
	pair<int, int> ans = {0, 0};
	for(int j = 0; j < (int) sets[x].size(); ++j)
	{
		int poz = sets[x][j];
		if(seturi[poz].empty())
			continue;
		int mx = *seturi[poz].rbegin();
		if(mx > ans.fi)
			ans = {mx, poz};
	}
	return ans;
}
int main()
{
	#ifdef fisier
		ifstream cin("mergeheap.in");
		ofstream cout("mergeheap.out");
	#endif
	
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	for(int i = 1; i <= 100; ++i)
		sets[i].push_back(i);
	
	cin >> n >> q;
	for(int i = 1; i <= q; ++i)
	{
		int tip;
		cin >> tip;
		if(tip == 1)
		{
			int mult, val;
			cin >> mult >> val;
			seturi[mult].insert(val);
		}
		if(tip == 2)
		{
			int mult;
			cin >> mult;
			pair<int, int> ans = solve(mult);
			seturi[ans.se].erase(seturi[ans.se].lower_bound(ans.fi));
			cout << ans.fi << '\n';
		}
		if(tip == 3)
		{
			int a, b;
			cin >> a >> b;
			for(int j = 0; j < (int) sets[b].size(); ++j)
				sets[a].push_back(sets[b][j]);
			sets[b].clear();
		}
	}
	return 0;
}