Cod sursa(job #2715858)

Utilizator FrostfireMagirescu Tudor Frostfire Data 4 martie 2021 12:22:09
Problema Matrice 2 Scor 45
Compilator cpp-64 Status done
Runda simularedelacasi1 Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#define f first
#define s second
#define NMAX 300
#define MMAX 90000
#define inf 2000000000

using namespace std;

ifstream fin("matrice2.in");
ofstream fout("matrice2.out");

int curr, n, q, nr, m, v[NMAX+10][NMAX+10], tata[MMAX+10], rang[MMAX+10], ans[MMAX+10];
set <int> s1[MMAX+10], s2[MMAX+10];

struct date
{	int cost, n1, n2;
}K[2*MMAX+10];

int cell(int r, int c)
{	return (r - 1) * n + c;
}

bool mycmp(date a, date b)
{	return a.cost > b.cost;
}

int findDaddy(int x)
{	int y = x, r = x;
	while(r != tata[r]) r = tata[r];
	while(x != tata[x])
		{	y = tata[x];
			tata[x] = r;
			x = y;
		}
	return r;
}

void unite(int x, int y)
{	if(s1[x].size() + s2[x].size() < s1[y].size() + s2[y].size()) swap(x, y);
	for(set <int>::iterator it=s1[y].begin(); it!=s1[y].end(); it++)
		s1[x].insert(*it);
	for(set <int>::iterator it=s2[y].begin(); it!=s2[y].end(); it++)
		s2[x].insert(*it);
	for(set <int>::iterator it=s1[x].begin(); it!=s1[x].end();)
		{	if(s2[x].count(*it))
				{	ans[*it] = curr;
					set <int>::iterator it1 = it;
					it1++;
					s1[x].erase(*it);
					s2[x].erase(*it);
					it = it1;
				}
			else it++;
		}
	tata[y] = x;
}

int main()
{
	fin >> n >> q;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			{	int nr1 = cell(i, j);
				fin >> v[i][j];
				if(i > 1)
					{	int nr2 = cell(i - 1, j);
						K[++nr] = {min(v[i][j], v[i-1][j]), nr1, nr2};
					}
				if(j > 1)
					{	int nr2 = cell(i, j - 1);
						K[++nr] = {min(v[i][j], v[i][j-1]), nr1, nr2};
					}
				tata[nr1] = nr1;
				rang[nr1] = 1;
			}
	for(int i=1; i<=q; i++)
		{	int x1, y1, x2, y2;
			fin >> x1 >> y1 >> x2 >> y2;
			int nr1 = cell(x1, y1), nr2 = cell(x2, y2);
			s1[nr1].insert(i);
			s2[nr2].insert(i);
		}
	sort(K+1, K+nr+1, mycmp);
	for(int i=1; i<=nr; i++)
		{	curr = K[i].cost;
			int val1 = findDaddy(K[i].n1), val2 = findDaddy(K[i].n2);
			if(val1 == val2) continue;
			unite(val1, val2);
		}
	for(int i=1; i<=q; i++)
		fout << ans[i] << '\n';
	return 0;
}