Nu aveti permisiuni pentru a descarca fisierul grader_test9.ok
Cod sursa(job #321649)
Utilizator | Data | 6 iunie 2009 20:07:00 | |
---|---|---|---|
Problema | Matrice 2 | Scor | 5 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.51 kb |
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 310
using namespace std;
struct pozitie {
int x, y, nr;
};
struct query {
int x1, y1, x2, y2, l, r, ct;
};
const int dl[4] = {0, 0, 1, -1};
const int dc[4] = {1, -1, 0, 0};
int n, i, j, nr, nrq, ind, d, lnou, cnou;
int v[maxn][maxn], cpoz[maxn][maxn];
query q[10100];
int l[10100], r[10100];
pozitie x[maxn * maxn];
int p[maxn * maxn], m[maxn];
int rez[10100];
bool cmp(pozitie a, pozitie b) {
if (a.nr > b.nr)
return true;
return false;
}
bool cmp2(query a, query b) {
if ((a.l + a.r) / 2 > (b.l + b.r) / 2)
return true;
return false;
}
int tata(int t) {
if (t == -1)
return -1;
if (p[t] == t)
return t;
p[t] = tata(p[t]);
return p[t];
}
int main() {
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
scanf("%d%d", &n, &nrq);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++) {
scanf("%d", &v[i][j]);
nr++;
x[nr].x = i; x[nr].y = j;
x[nr].nr = v[i][j];
}
sort(x + 1, x + nr + 1, cmp);
/* for (i = 1; i <= nr; i++)
fprintf(stderr, "%d %d %d\n", x[i].x, x[i].y, x[i].nr);*/
for (i = 1; i <= nr; i++)
cpoz[x[i].x][x[i].y] = i;
for (i = 1; i <= nrq; i++) {
scanf("%d%d%d%d", &q[i].x1, &q[i].y1, &q[i].x2, &q[i].y2);
q[i].l = 1; q[i].r = 1000000;
q[i].ct = i;
}
// fprintf(stderr, "%d\n", tata(-1));
while (q[1].l <= q[1].r) {
sort(q + 1, q + nrq + 1, cmp2);
for (i = 1; i <= nrq; i++)
if (q[i].l <= q[i].r)
m[i] = (q[i].l + q[i].r) / 2;
else
m[i] = 0;
/* for (i = 1; i <= nrq; i++)
printf("%d %d ", m[i], q[i].x1);
printf("\n");*/
memset(p, -1, sizeof(p));
i = 1; ind = 1;
while (i <= nr) {
while (m[ind] > x[i].nr && ind <= nrq) {
if (tata(cpoz[q[ind].x1][q[ind].y1]) == tata(cpoz[q[ind].x2][q[ind].y2]) && tata(cpoz[q[ind].x1][q[ind].y1]) != -1) {
rez[q[ind].ct] = max(rez[q[ind].ct], m[ind]);
q[ind].l = m[ind] + 1;
}
else
q[ind].r = m[ind] - 1;
ind++;
}
j = i;
while (x[i].nr == x[j].nr && j <= nr) {
p[j] = j;
for (d = 0; d < 4; d++) {
lnou = x[j].x + dl[d];
cnou = x[j].y + dc[d];
if (lnou > 0 && lnou <= n && cnou > 0 && cnou <= n && p[cpoz[lnou][cnou]] != -1)
p[tata(cpoz[lnou][cnou])] = j;
}
j++;
}
i = j;
}
/* for (; ind <= nrq; ind++)
rez[q[ind].ct] = 1;*/
}
for (i = 1; i <= nrq; i++)
printf("%d\n", rez[i]);
return 0;
}