Cod sursa(job #321644)

Utilizator CezarMocanCezar Mocan CezarMocan Data 6 iunie 2009 20:01:33
Problema Matrice 2 Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 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;
			q[ind].r = m[ind] - 1;
		}
		
	}
	
	for (i = 1; i <= nrq; i++)
		printf("%d\n", rez[i]);

	return 0;
}