Cod sursa(job #1064143)

Utilizator Robert29FMI Tilica Robert Robert29 Data 21 decembrie 2013 16:35:46
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

int sol[20001], t[90001], noduri[302][302];
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
struct numere
{
	int val, poz, x, y;
}A[90001], Q2[20001];

struct querry
{

	int x1, y1, x2, y2;
}Q[20001];

inline int cmp(numere a, numere b)
{
	return a.val > b.val;
}
int tata(int x)
{
	if (x != t[x])
		t[x] = tata(t[x]);
	return t[x];
}
int main()
{
	FILE*f = fopen("matrice.in", "r");
	int n, q;
	fscanf(f, "%d %d", &n, &q);
	int nr = 0;
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			fscanf(f, "%d", &A[++nr].val);
			A[nr].poz = nr;
			A[nr].x = i;
			A[nr].y = j;
		}
	}

	for (int i = 1; i <= q; ++i)
		fscanf(f, "%d %d %d %d", &Q[i].x1, &Q[i].y1, &Q[i].x2, &Q[i].y2);

	fclose(f);

	sort(A + 1, A + nr + 1, cmp);

	int pas=1;
	for (; pas < A[1].val; pas <<= 1);
	
	for (; pas; pas >>= 1)
	{
		for (int I = 1; I <= q; ++I)
		{
			Q2[I].val = sol[I] + pas;
			Q2[I].poz = I;
		}
		for (int I = 1; I <= nr; ++I)
		{
			t[I] = I;
		}
		sort(Q2 + 1, Q2 + q + 1, cmp);
		
		for (int I = 1; I <= n; ++I)
		{
			for (int j = 1; j <= n; ++j)
			{
				noduri[I][j] = 0;
			}
		}

		int i=1, j=1;
		for (i = 1, j = 1; i <= nr;)
		{

			for (; j <= q&&Q2[j].val > A[i].val; ++j)
			{
				if (tata(n*(Q[Q2[j].poz].x1-1) + Q[Q2[j].poz].y1) == tata(n*(Q[Q2[j].poz].x2-1) + Q[Q2[j].poz].y2))
				{
					sol[Q2[j].poz] += pas;
				}
			}


			for (int ii = i; A[i].val == A[ii].val; ++i)
			{
				noduri[A[i].x][A[i].y] = 1;

				for (int dir = 0; dir < 4; ++dir)
				{
					int xv = A[i].x + dx[dir];
					int yv = A[i].y + dy[dir];

					if (xv && yv && xv <= n && yv <= n && noduri[xv][yv])
					{
						t[t[tata((xv - 1)*n + yv)]] = t[A[i].poz];
					}

				}

			}


		}

		for (; j <= q; ++j)
		{
			if (tata((n - 1)*Q[Q2[j].poz].x1 + Q[Q2[j].poz].y1) == tata((n - 1)*Q[Q2[j].poz].x2 + Q[Q2[j].poz].y2))
			{
				sol[Q2[j].poz] += pas;
			}
		}

	}
	

	FILE*g = fopen("matrice.out", "w");
	for (int i = 1; i <= q; ++i)
	{
		fprintf(g, "%d\n", sol[i]);
	}
	fclose(g);

	return 0;
}