Cod sursa(job #1162629)

Utilizator raulstoinStoin Raul raulstoin Data 31 martie 2014 21:41:49
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<fstream>
#include<algorithm>
#include<set>
#include<cstring>

#define NMAX 305
#define QMAX 20005

using namespace std;

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

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

struct Mat
{
	int i,j,val;
	static bool sort_val(Mat a,Mat b)
	{
		return a.val>b.val;
	}
}v[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];

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

void Join(int i,int j)
{
	int nod=(i-1)*n+j,ii,jj;
	G[nod]=nod;
	set<int> aux;
	set<int>::iterator it;
	aux.insert(G[nod]);
	for(int k=0;k<4;k++)
	{
		ii=i+dx[k];
		jj=j+dy[k];
		if(G[ (ii-1)*n+jj ] && ii>0 && jj>0 && ii<=n && jj<=n)
			aux.insert(Find((ii-1)*n+jj));
	}
	int val=*(aux.begin());
	for(it=aux.begin();it!=aux.end();++it)
		G[*it]=val;
}

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;
		}
	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;j<=n*n && sol[i].val+p<=v[j].val;j++)
				Join( v[j].i,v[j].j );
			int n1=Find((sol[i].X1-1)*n+sol[i].Y1),n2=Find((sol[i].X2-1)+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;
}