Pagini recente » Cod sursa (job #1888213) | Cod sursa (job #1544511) | Cod sursa (job #1121430) | Cod sursa (job #2309574) | Cod sursa (job #2738732)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
///***********************
const int NMAX = 303;
int n, q, a[NMAX][NMAX];
const int dirs = 4, dirI[] = {1, -1, 0, 0}, dirJ[] = {0, 0, 1, -1};
bool isInside(int i, int j) {
return i >= 1 && i <= n && j >= 1 && j <= n;
}
bool lee(int mid, int i1, int j1, int i2, int j2) {
if (a[i1][j1] < mid) {
return false;
}
queue<pair<int, int>> q;
array<bitset<NMAX>, NMAX> vis;
q.emplace(i1, j1);
vis[i1][j1] = true;
while (!q.empty()) {
int i, j;
tie(i, j) = q.front();
q.pop();
for (int dir = 0; dir < dirs; dir++) {
int newI = i + dirI[dir];
int newJ = j + dirJ[dir];
if (isInside(newI, newJ) && !vis[newI][newJ] && a[newI][newJ] >= mid) {
vis[newI][newJ] = true;
q.emplace(newI, newJ);
}
}
}
return vis[i2][j2];
}
int main() {
fin >> n >> q;
int maxi = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
fin >> a[i][j];
maxi = max(maxi, a[i][j]);
}
}
while (q--) {
int i1, j1, i2, j2;
fin >> i1 >> j1 >> i2 >> j2;
int l = 1, r = maxi, ans = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (lee(mid, i1, j1, i2, j2)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
fout << ans << endl;
}
return 0;
}