Pagini recente » Cod sursa (job #1582023) | Cod sursa (job #11853) | Painting | Cod sursa (job #3142169) | Cod sursa (job #1994925)
#include <bits/stdc++.h>
#define l first
#define c second
#define MAXN 300
#define MAXQ 20000
int mat[MAXN + 2][MAXN + 2];
std::pair <int, int> v[MAXN * MAXN + 1];
bool cmp(std::pair <int, int> a, std::pair <int, int> b) {
return mat[a.l][a.c] < mat[b.l][b.c];
}
int sef[MAXN * MAXN + 1];
int myfind(int x) {
if(sef[x] == 0)
return x;
return sef[x] = myfind(sef[x]);
}
int sol[MAXQ + 1];
struct Query {
int ind1, ind2;
int pos;
bool operator <(const Query &other) const {
return sol[pos] > sol[other.pos];
}
}qry[MAXQ + 1];
char dl[] = {-1, 0, 1, 0}, dc[] = {0, -1, 0, 1};
inline void check(int pas, int n, int q) {
std::sort(qry + 1, qry + q + 1);
memset(sef, 0, sizeof(sef));
int p = n * n;
for(int i = 1; i <= q; i++) {
while(p >= 1 && mat[v[p].l][v[p].c] >= sol[qry[i].pos] + pas) {
int nod = v[p].l * n + v[p].c - n;
for(int j = 0; j < 4; j++) {
int l = v[p].l + dl[j];
int c = v[p].c + dc[j];
if(l > 0 && l <= n && c > 0 && c <= n && mat[l][c] >= sol[qry[i].pos] + pas && myfind(nod) != myfind(l * n + c - n))
sef[myfind(nod)] = myfind(l * n + c - n);
}
p--;
}
if(myfind(qry[i].ind1) == myfind(qry[i].ind2))
sol[qry[i].pos] += pas;
}
}
int main() {
FILE *fi, *fout;
int i, j, n, q;
fi = fopen("matrice2.in" ,"r");
fout = fopen("matrice2.out" ,"w");
fscanf(fi,"%d %d " ,&n,&q);
int sz = 0;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++) {
fscanf(fi,"%d " ,&mat[i][j]);
sz++;
v[sz].l = i;
v[sz].c = j;
}
std::sort(v + 1, v + sz + 1, cmp);
for(i = 1; i <= q; i++) {
int x1, y1, x2, y2;
fscanf(fi,"%d %d %d %d " ,&x1, &y1, &x2, &y2);
qry[i].ind1 = x1 * n + y1 - n;
qry[i].ind2 = x2 * n + y2 - n;
qry[i].pos = i;
}
for(int pas = 1 << 19; pas; pas >>= 1)
check(pas, n, q);
for(i = 1; i <= q; i++)
fprintf(fout,"%d\n" ,sol[i]);
fclose(fi);
fclose(fout);
return 0;
}