Cod sursa(job #532390)

Utilizator cosmyoPaunel Cosmin cosmyo Data 11 februarie 2011 14:54:56
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 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]);
//	printf("%d %d\n", R, x);
	for(;x != T[x];) {
		y = T[x];
		T[x] = R;
		x = y;
//		printf("%d ", y);
	}
//	printf("\n");
	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 sw = 1, k , i, p, l, cl, nod;
	int nr = 0;
	c[0].v = c[1].v + 1;
	int step = 1 << 20;
	for(;step; step /= 2) {
		sw = 0;
		++nr;
		for(i = 1;  i<= m; ++i)
			q[i].i += step;
		sort(q + 1, q + m + 1, cmp2);
		p = 1;
//		for(i = 1; i <= n * n; ++i)
//			printf("%d ", c[i].v);
//		printf("\n");
//		for(i = 1; i<= m; ++i)
//			printf("%d \n", q[i].i);
//		printf("\n");
		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) {
	//			printf("%d %d %d\n", c[p].v, c[p].i, c[p].j);
				v[c[p].nod] = 1; 
				for(k = 0; k <= 3; ++k) {
					l = c[p].i + dl[k];
					cl = c[p].j + dc[k];
					nod = (l - 1) * n + cl;
				//	printf("%d %d %d %d\n", l, cl, find(nod), find(c[p].nod));
					if(nod > 0 && v[nod] && (find(nod) != find(c[p].nod)) )
				//		printf("%d %d %d %d\n", c[p].i, c[p].j, l, cl),
						unite(find(nod), find(c[p].nod));

				}
			 ++p;
			}
			
//		printf("%d %d %d %d\n", st[q[i].v].nod, fin[q[i].v].nod, find(st[q[i].v].nod), find(fin[q[i].v].nod));
		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, p = 1 << 20, 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 = 1;
		q[i].j = p;
		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;
}