Cod sursa(job #518411)

Utilizator ooctavTuchila Octavian ooctav Data 31 decembrie 2010 15:46:10
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;

const int INF = 1000000005;
const int NMAX = 305;
const int HMAX = 1000005;
const int QMAX = 20005;

int N, Q;
int a[NMAX][NMAX];
int x1, f1, x2, f2;
int rez[NMAX][NMAX];
int lin[] = {-1, 0, 0, 1};
int col[] = {0, -1, 1, 0};
pair<int, int> poz[NMAX*NMAX];
pair<int, int> tata[NMAX][NMAX];
int exista[HMAX], hm, NR = 1;
int c[QMAX][5], sol[QMAX];

bool nul(pair<int, int> x)
{
	if(!x.first && !x.second)
		return 1;
	return 0;
}

void citi()
{
	scanf("%d %d", &N, &Q);
	for(int i = 1 ; i <= N ; i++)
		for(int j = 1 ; j <= N ; j++)
		{
			scanf("%d", &a[i][j]);
			poz[(i - 1)*N + j] = make_pair(i, j);
			exista[a[i][j]]++;
			hm = max(hm, a[i][j]);
		}
	for(int i = 1 ; i <= N ; i++)
		scanf("%d%d%d%d", &c[i][1], &c[i][2], &c[i][3], &c[i][4]);
}

bool in(int x, int y)
{
	if(1 <= x && x <= N && 1 <= y && y <= N)
		return 1;
	return 0;
}

pair<int, int> find(int x, int y)
{
	pair<int, int> rad = tata[x][y];
	for(; rad != tata[rad.first][rad.second]; rad = tata[rad.first][rad.second]);
	while(x != tata[x][y].first || y != tata[x][y].second)
	{
		x = tata[x][y].first;
		y = tata[x][y].second;
		tata[x][y] = rad;
	}
	return rad;
}

void scrie()
{
	for(int i = 1 ; i <= Q ; i++)
		printf("%d\n", sol[i]);
}

bool cmp(pair<int, int> x, pair<int, int> y)
{
	return a[x.first][x.second] >= a[y.first][y.second];
}

int main()
{
	freopen("matrice2.in", "r", stdin);
	freopen("matrice2.out", "w", stdout);
	citi();
	a[0][0] = INF;//ma ajuta la soratre , car face fite
	sort(poz, poz + N * N + 1, cmp);
	
	for(int i = hm ; i ; i--)
		if(exista[i])
		{
			for( ; a[poz[NR].first][poz[NR].second] == i ; NR++)
			{
				int x = poz[NR].first, y = poz[NR].second;
				rez[x][y] = 1;
				tata[x][y] = make_pair(x, y);
				for(int k = 0 ; k <= 3 ; k++)
					if(in(x + lin[k], y + col[k]) && rez[x + lin[k]][y + col[k]])
						{
							pair<int, int> r = find(x, y), p = find(x + lin[k], y + col[k]);
							tata[r.first][r.second] = make_pair(p.first, p.second);
						}
			}
			for(int q = 1 ; q <= Q ; q++)
				if(!nul(tata[c[q][1]][c[q][2]]) && !nul(tata[c[q][3]][c[q][4]]))
				{
					pair<int, int> x = find(c[q][1], c[q][2]), y = find(c[q][3], c[q][4]);
					if(x == y && !sol[q])
						sol[q] = i;
				}
		}
	scrie();
	return 0;
}