Pagini recente » Cod sursa (job #3171058) | Cod sursa (job #2686715) | Cod sursa (job #291322) | Cod sursa (job #1720716) | Cod sursa (job #2724372)
#include <bits/stdc++.h>
using namespace std;
ifstream in("matrice2.in");
ofstream out("matrice2.out");
const int ox[] = {0, 1, 0, -1};
const int oy[] = {1, 0, -1, 0};
const int max_n = (int)90500 + 5;
struct Query {
int x1, y1, x2, y2, ans;
};
struct Number {
int cell, value;
};
int n, m;
int dad[max_n];
int v[max_n];
Query qr[max_n];
Number vals[max_n];
vector<int> g[max_n];
bool operator < (const Number &a, const Number &b) {
if (a.value == b.value) {
return a.cell < b.cell;
}
return a.value > b.value;
}
int Find(int u) {
if (u == dad[u]) {
return u;
}
return dad[u] = Find(dad[u]);
}
set<int> st[max_n];
void join(int u, int v, int value) {
for (int x : st[u]) {
if (st[v].find(x) != st[v].end()) {
qr[x].ans = value;
st[v].erase(x);
st[u].erase(x);
} else {
st[v].insert(x);
st[u].erase(x);
}
}
dad[u] = v;
}
int main() {
in >> n >> m;
int cnt = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
int val;
in >> val;
v[i * n + j] = val;
vals[++cnt] = {i * n +j, val};
for (int k = 0; k < 4; ++k) {
int nx = i + ox[k];
int ny = j + oy[k];
if (nx >= 1 && ny >= 1 && nx <= n && ny <= n) {
g[i * n + j].push_back(nx * n + ny);
}
}
dad[i * n +j] = i * n + j;
}
}
sort(vals + 1, vals + n * n + 1);
auto f = [&](int x, int y) {
return n * x + y;
};
for (int i = 1; i <= m; ++i) {
in >> qr[i].x1 >> qr[i].y1 >> qr[i].x2 >> qr[i].y2;
st[f(qr[i].x1, qr[i].y1)].insert(i);
st[f(qr[i].x2, qr[i].y2)].insert(i);
}
for (int i = 1; i <= n * n; ++i) {
int cell = vals[i].cell;
for (int u : g[cell]) {
if (v[u] >= vals[i].value) {
if (Find(cell) == Find(u)) {
continue;
}
join(Find(cell), Find(u), vals[i].value);
}
}
}
for (int i = 1; i <= m; ++i) {
out << qr[i].ans << "\n";
}
return 0;
}