Cod sursa(job #1162784)

Utilizator raulstoinStoin Raul raulstoin Data 31 martie 2014 23:18:20
Problema Matrice 2 Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<cstring>

#define NMAX 305
#define QMAX 20005

using namespace std;

ifstream fin("matrice2.in");
ofstream fout("matrice2.out");

int n,q,G[NMAX*NMAX],dx[]={-1,0,1,0},dy[]={0,1,0,-1},Index[NMAX][NMAX];

struct Mat
{
	int i,j,val;
	static bool sort_val(Mat a,Mat b)
	{
		return a.val>b.val;
	}
}v[NMAX*NMAX];

struct Query
{
	int X1,Y1,X2,Y2,ind,val;
	static bool sort_val(Query a,Query b)
	{
		return a.val>b.val;
	}
	static bool sort_ind(Query a,Query b)
	{
		return a.ind<b.ind;
	}
}sol[QMAX];

inline int Find(int nod)
{
	if(nod!=G[nod])
		return (G[nod]=Find(G[nod]));
	return nod;
}

int V[6];

inline void Join(int i,int j)
{
	int ii,jj;
	V[0]=1;
	V[1]=Index[i][j];
	for(int k=0;k<4;k++)
	{
		ii=i+dx[k];
		jj=j+dy[k];
		if(G[Index[ii][jj]])
			V[++V[0]]=Find(G[Index[ii][jj]]);
	}
	sort(V+1,V+V[0]+1);
	for(int i=1;i<=V[0];i++)
		G[V[i]]=V[1];
}

int main()
{
	fin>>n>>q;
	for(int i=1,k=0;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			v[++k].i=i;
			v[k].j=j;
			fin>>v[k].val;
			Index[i][j]=k;
		}
	for(int i=1;i<=q;i++)
	{
		fin>>sol[i].X1>>sol[i].Y1>>sol[i].X2>>sol[i].Y2;
		sol[i].ind=i;
	}
	sort(v+1,v+n*n+1,Mat::sort_val);
	for(int p=(1<<20);p;p/=2)
	{
		memset(G,0,sizeof G);
		sort(sol+1,sol+q+1,Query::sort_val);
		for(int i=1;i<=q;i++)
		{
			for(int j=1;sol[i].val+p<=v[j].val;j++)
				Join( v[j].i,v[j].j );
			int n1=Find(Index[sol[i].X1][sol[i].Y1]),n2=Find(Index[sol[i].X2][sol[i].Y2]);
			if(n1==n2 && n1)
				sol[i].val+=p;
		}
	}
	sort(sol+1,sol+q+1,Query::sort_ind);
	for(int i=1;i<=q;i++)
		fout<<sol[i].val<<'\n';
	return 0;
}