Pagini recente » Cod sursa (job #1979978) | Cod sursa (job #1894719) | Cod sursa (job #117062) | Cod sursa (job #44083) | Cod sursa (job #2449133)
#include <bits/stdc++.h>
using namespace std;
ifstream in("matrice2.in");
ofstream out("matrice2.out");
const int xplus[] = {0, 0, -1, 1};
const int yplus[] = {1, -1, 0, 0};
struct Data {
int x, y, val;
bool operator< (const Data &other) const {
return val > other.val;
}
};
struct Queries {
int ax, ay, bx, by;
int initialpos;
int answer;
bool operator< (const Queries &other) const {
return answer > other.answer;
}
};
int findad(int a, vector<int> &dad) {
if(a == dad[a])
return a;
return dad[a] = findad(dad[a], dad);
}
void link(int a, int b, vector<int> &dad, vector<int> &len) {
a = findad(a, dad);
b = findad(b, dad);
if(len[a] < len[b]) {
dad[a] = b;
len[b] += len[a];
} else {
dad[b] = a;
len[a] += len[b];
}
}
bool isok(int x, int y, int n) {
if(1 <= x && x <= n && 1 <= y && y <= n)
return 1;
return 0;
}
int main() {
int n, nqr;
in >> n >> nqr;
vector<Data> v(n * n);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++) {
int val;
in >> val;
v[n * (i - 1) + j - 1] = {i, j, val};
}
sort(v.begin(), v.end());
vector<vector<int>> pos(n + 1, vector<int> (n + 1, 0));
for(int i = 0; i < n * n; i ++)
pos[v[i].x][v[i].y] = i;
vector<Queries> q(nqr);
for(int i = 0; i < nqr; i ++) {
in >> q[i].ax >> q[i].ay >> q[i].bx >> q[i].by;
q[i].initialpos = i;
}
vector<int> dad(n * n);
vector<int> len(n * n);
for(int step = (1 << 19); step; step >>= 1) {
sort(q.begin(), q.end());
for(int i = 0; i < n * n; i ++) {
len[i] = 1;
dad[i] = i;
}
int i = 0;
for(auto &it : q) {
while(i < n * n && v[i].val >= it.answer + step) {
for(int dir = 0; dir < 4; dir ++) {
int newx = v[i].x + xplus[dir];
int newy = v[i].y + yplus[dir];
if(!isok(newx, newy, n))
continue;
int newpos = pos[newx][newy];
if(v[newpos].val >= it.answer + step && findad(newpos, dad) != findad(i, dad))
link(newpos, i, dad, len);
}
i ++;
}
if(findad(pos[it.ax][it.ay], dad) == findad(pos[it.bx][it.by], dad))
it.answer += step;
}
}
vector<int> sol(nqr);
for(int i = 0; i < nqr; i ++)
sol[q[i].initialpos] = q[i].answer;
for(auto it : sol)
out << it << "\n";
return 0;
}