Cod sursa(job #321722)

Utilizator CezarMocanCezar Mocan CezarMocan Data 6 iunie 2009 23:26:46
Problema Matrice 2 Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 510

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, ok, dx, xxx, mn;
int bine[10100];
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 > b.l)
		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);

	mn = 2000000000;
	scanf("%d%d", &n, &nrq);
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++) {
			scanf("%d", &v[i][j]);
			mn = min(v[i][j], mn);
			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++)
		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 = 0; 
		q[i].ct = i;
	}

	ok = 1;

	for (xxx = 20; xxx >= 0; xxx--) {
		
		sort(q + 1, q + nrq + 1, cmp2);
		for (i = 1; i <= nrq; i++)
			m[i] = (q[i].l + (1 << xxx));

		memset(p, -1, sizeof(p));
		memset(bine, 0, sizeof(bine));

		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) 
					bine[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;
		}
		
		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) 
				bine[ind] = 1;
			ind++;
		}
		
		
		for (i = 1; i <= nrq; i++)
			if (bine[i])
				q[i].l = (q[i].l + (1 << xxx));
		
	}
	
	for (i = 1; i <= nrq; i++) {
		if (q[i].l == 0)
			q[i].l = 0;
		rez[q[i].ct] = q[i].l;
	}
	
	for (i = 1; i <= nrq; i++)
		printf("%d\n", rez[i]);

	return 0;
}