Pagini recente » Cod sursa (job #2199430) | Cod sursa (job #1641612) | Istoria paginii runda/vacanta_10_2/clasament | Cod sursa (job #1650220) | Cod sursa (job #2715913)
#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';
}