Cod sursa(job #2715913)

Utilizator mircearoataMircea Roata Palade mircearoata Data 4 martie 2021 13:14:09
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda simularedelacasi1 Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>

#define POS(i, j) ((i - 1) * n + j)

using namespace std;

const int di[] = { 0, 1, 0, -1 };
const int dj[] = { 1, 0, -1, 0 };

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

int n, q;
int mat[305][305];
pair<int, pair<int, int>> ordered[90005];
int ans[20005];

set<int> setQueries[90005];

namespace DSU {
	int f[90005];
	int sz[90005];

	int father(int x) {
		int tmp = x;
		while (f[x] != x) x = f[x];
		while (f[tmp] != x) {
			int tmp2 = f[tmp];
			f[tmp] = x;
			tmp = tmp2;
		}
		return x;
	}

	void join(int& x, int& y) {
		x = father(x);
		y = father(y);
		if (x != y) {
			if (sz[x] < sz[y])
				swap(x, y);
			f[y] = x;
			sz[x] += sz[y];
		}
	}
}

int main() {
	in >> n >> q;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			in >> mat[i][j];
			ordered[POS(i, j)] = { mat[i][j], {i, j} };
			DSU::f[POS(i, j)] = POS(i, j);
			DSU::sz[POS(i, j)] = 1;
		}
	}
	sort(ordered + 1, ordered + n * n + 1, greater<pair<int, pair<int, int>>>());
	for (int i = 1; i <= q; i++) {
		int i1, j1, i2, j2;
		in >> i1 >> j1 >> i2 >> j2;
		setQueries[POS(i1, j1)].insert(i);
		setQueries[POS(i2, j2)].insert(i);
	}
	for (int el = 1; el <= n * n; el++) {
		int i = ordered[el].second.first;
		int j = ordered[el].second.second;
		for (int d = 0; d < 4; d++) {
			int i2 = i + di[d];
			int j2 = j + dj[d];
			if (mat[i][j] < mat[i2][j2] || (mat[i][j] == mat[i2][j2] && (i < i2 || j < j2))) {
				int x1 = DSU::father(POS(i, j));
				int x2 = DSU::father(POS(i2, j2));
				if (x1 != x2) {
					DSU::join(x1, x2);
					for (auto query : setQueries[x2]) {
						auto it = setQueries[x1].find(query);
						if (it == setQueries[x1].end()) {
							setQueries[x1].insert(query);
						}
						else {
							// joined 2 sets that had the same query => solved the query
							ans[query] = mat[i][j];
							setQueries[x1].erase(it);
						}
					}
				}
			}
		}
	}
	for (int i = 1; i <= q; i++)
		out << ans[i] << '\n';
}