Cod sursa(job #798542)

Utilizator naruto_uzumakiNaruto Uzumaki naruto_uzumaki Data 16 octombrie 2012 18:57:04
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int N = 310;
const int Q  = 21000;

const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};

int n, qq, x[N][N], nr, sol[Q], q[Q], poz[Q], val[N * N], e[N * N], X[N * N], Y[N * N], ver[N][N], p[N * N];

int x1[Q], y11[Q], x2[Q], y2[Q];

int rad(int nod) {
	if(!p[nod])
		return nod;
	return  p[nod] = rad(p[nod]);
}

bool cmp(int a, int b) {
	return val[a] > val[b];
}

bool cmp2(int a, int b) {
	return q[a] > q[b];
}

int conv(int x, int y) {
	return (x - 1) * n + y;
}

void add(int el) {
	int i, nx, ny;
	
	ver[X[el]][Y[el]] = 1;
	
	for(i = 0; i<4; ++i) {
		
		nx = X[el] + dx[i];
		ny = Y[el] + dy[i];
		
		if(ver[nx][ny])
			p[rad(conv(nx, ny))] = el;
	}
}

bool verQ(int nr) {
	int r1 = rad(conv(x1[nr], y11[nr])), r2 = rad(conv(x2[nr], y2[nr]));
	
	return r1 == r2;
}

int main() {
	int i, j, pas = 1;
	
	freopen("matrice2.in", "r", stdin);
	freopen("matrice2.out", "w", stdout);
	
	cin >> n >> qq;
	
	for(i = 1; i<=n; ++i)
		for(j = 1; j<=n; ++j) {
			
			cin >> x[i][j];
			
			e[++nr] = nr;
	
			val[nr] = x[i][j];
			
			X[nr] = i; Y[nr] = j; 
		}
	
	sort(e + 1, e + nr + 1, cmp);
	
	for(i = 1; i<=qq; ++i)
		cin >> x1[i] >> y11[i] >> x2[i] >> y2[i];
	
	while(pas * 2 < x[X[e[1]]][Y[e[1]]]) pas >>= 1;
	
	while(pas) {
		
		for(i = 1; i<=qq; ++i) {
			q[i] = sol[i] + pas;
			poz[i] = i;
		}
		
		sort(poz + 1, poz + qq + 1, cmp2);
		
		//init
		for(i = 1; i<=n; ++i)
			for(j = 1; j<=n; ++j)
				ver[i][j] = 0;
		for(i = 1; i<=nr; ++i)
			p[i] = 0;
		//end init
		
		for(i = 1, j = 1; i<=nr && j<=qq;) {
			while(val[i] >= q[poz[j]]) {
				
				add(e[i]);
				++i;
			}
			
			if(verQ(poz[j])) {
				sol[j] += pas;
				++j;
			}
		}
	}
	
	for(i = 1; i<=qq; ++i)
		cout << sol[i] << "\n";
	
	return 0;
}