Cod sursa(job #532476)

Utilizator cosmyoPaunel Cosmin cosmyo Data 11 februarie 2011 18:52:18
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 305 * 305;

int dl[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0 ,- 1};

int a[305][305], n, m, RG[N], T[N], v[N];
struct tip {int v, i, j, nod;} c[N], q[N], st[20005], fin[20005];

int cmp(tip a, tip b) {
	return a.v > b.v;
}

int cmp2(tip a, tip b) {
	return a.i > b.i;
}

int find(int x) {
	int R, y;
	for(R = x; R != T[R]; R = T[R]);
	for(;x != T[x];) {
		y = T[x];
		T[x] = R;
		x = y;
	}
	return R;
}

void unite(int x, int y) {
	if(RG[x] > RG[y])
		T[y] = x;
	else
		T[x] = y;
	if(RG[x] == RG[y])
		++RG[y];
}

void solve() {
	sort(c + 1, c + n * n + 1, cmp);
	int  k , i, p, l, cl, nod;
	c[0].v = c[1].v + 1;
	int step = 1 << 20;
	for(;step; step /= 2) {
		for(i = 1;  i<= m; ++i)
			q[i].i += step;
		sort(q + 1, q + m + 1, cmp2);
		p = 0;

		for(i = 1; i <= n * n; ++i){
				RG[i] = 1;
				T[i] = i;
				v[i] = 0;
			}
		for(i = 1; i <= m; ++i) {
			while(c[p].v >= q[i].i && p <= n * n) {
				v[c[p].nod] = 1; 
				for(k = 0; k <= 3; ++k) {
					l = c[p].i + dl[k];
					cl = c[p].j + dc[k];
					if(l <= n && l >= 1 && cl <= n && cl >= 1) {
					nod = (l - 1) * n + cl;
					if(v[nod] && (find(nod) != find(c[p].nod)) )
						unite(find(nod), find(c[p].nod));

				
					}
				}
			 ++p;
			}
	
		if(find(st[q[i].v].nod) == find(fin[q[i].v].nod))
			;
		else
			q[i].i -= step ;
		}
	}
}

int cmp3(tip a, tip b) {
	return a.v < b.v;
}

int main() {
	freopen("matrice2.in", "r", stdin);
	freopen("matrice2.out", "w", stdout);
	int i, j, nr = 0,  x, y, X, Y;
	scanf("%d %d", &n, &m);
	
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j) {
			scanf("%d ", &x);
			c[++nr].v = x;
			c[nr].i = i;
			c[nr].j = j;
			c[nr].nod = (i - 1) * n + j;
		}
	
	for(i = 1; i <= m; ++i) {
		scanf("%d %d %d %d", &x, &y, &X, &Y);
		q[i].v = i;
		q[i].i = 0;
		st[i].nod = (x - 1) * n + y;
		fin[i].nod = (X - 1) * n + Y;
	}
	
	solve();

	sort(q + 1, q + m + 1, cmp3);
	for(i = 1; i <= m; ++i)
		printf("%d \n", q[i].i);

	return 0;
}