Pagini recente » Cod sursa (job #1803646) | Cod sursa (job #1722839) | Cod sursa (job #2550961) | Cod sursa (job #321697) | Cod sursa (job #2675933)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("matrice2.in");
ofstream out ("matrice2.out");
struct Query {
int x1, y1, x2, y2, ind, ans;
bool operator < (const Query &other) const {
return ans > other.ans;
}
} a[20005];
int n, q;
int v[305][305], t[90005], sz[90005];
pair <int, int> w[90005];
int d[4];
int cod(int i, int j) {
return n * (i - 1) + j;
}
int tata(int x) {
if(t[x] == x)
return x;
t[x] = tata(t[x]);
return t[x];
}
void join(int x, int y) {
if(x == y)
return;
if(sz[x] > sz[y])
t[y] = x, sz[x] += sz[y];
else
t[x] = y, sz[y] += sz[x];
}
bool comp(Query a, Query b) {
return a.ind < b.ind;
}
int main() {
in >> n >> q;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
in >> v[i][j];
int c = cod(i, j);
w[c] = {-v[i][j], c};
}
}
for(int i = 1; i <= q; i++)
in >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2, a[i].ind = i;
sort(w + 1, w + n * n + 1);
d[0] = -1, d[1] = -n, d[2] = n, d[3] = 1;
for(int p = (1 << 19); p; p >>= 1) {
sort(a + 1, a + q + 1);
int j = 1;
for(int i = 1; i <= n * n; i++)
t[i] = i, sz[i] = 1;
for(int i = 1; i <= q; i++) {
int val = a[i].ans + p;
while(-w[j].first >= val && j <= n * n) {
for(int k = 0; k < 4; k++) {
int c = w[j].second + d[k];
if(c < 1 || c > n * n || v[(c + n - 1) / n][(c % n == 0 ? n : c % n)] < val)
continue;
join(tata(w[j].second), tata(c));
}
j++;
}
if(tata(cod(a[i].x1, a[i].y1)) == tata(cod(a[i].x2, a[i].y2)))
a[i].ans += p;
}
}
sort(a + 1, a + q + 1, comp);
for(int i = 1; i <= q; i++)
out << a[i].ans << "\n";
return 0;
}