Cod sursa(job #320669)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 5 iunie 2009 14:08:38
Problema Matrice 2 Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
#include<algorithm>
#define M 90010
using namespace std;
int n,q,p,i,j,m,a[M],U[M],D[M],L[M],R[M],f[M],s[M],v[M],b[M],c[M],
val,root,co[M],lc,Q[M],vec,dad[M],sol[M],l,pr,ul,k,
ca(int p1,int p2),cv(int p1,int p2);
void read(),solve(),Graph(),enque();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	int x,y;
	freopen("matrice2.in","r",stdin);
	freopen("matrice2.out","w",stdout);
	scanf("%d%d",&n,&q);m=n*n;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			p++;scanf("%d",&a[p]);b[p]=p;
		}
    for(i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		f[i]=(x-1)*n+y;
		scanf("%d%d",&x,&y);
		s[i]=(x-1)*n+y;
		v[i]=a[f[i]]<a[s[i]]?a[f[i]]:a[s[i]];
		c[i]=i;
	}
}
void solve()
{
	Graph();
	sort(b+1,b+m+1,ca);
	sort(c+1,c+q+1,cv);
	pr=1;ul=0;k=1;
	for(i=1;i<=m;i++)
	{
		val=a[b[i]];
		while(a[b[i]]==val)
		{ 
			root=b[i];lc=1;co[1]=b[i];
			vec=U[b[i]];if(dad[vec])enque();
			vec=D[b[i]];if(dad[vec])enque();
			vec=L[b[i]];if(dad[vec])enque();
			vec=R[b[i]];if(dad[vec])enque();
			for(j=1;j<=lc;j++)dad[co[j]]=root;
			i++;
		}
		i--;
		while(v[c[k]]==val)
		{
			Q[++ul]=c[k++];
		}
		for(j=pr;j<=ul;j++)
		{
			vec=f[Q[j]];lc=1;co[1]=vec;
			for(;;){if(vec==dad[vec])break;vec=dad[vec];co[++lc]=vec;}
			for(l=1;l<=lc;l++)dad[co[l]]=vec;
			vec=s[Q[j]];lc=1;co[1]=vec;
			for(;;){if(vec==dad[vec])break;vec=dad[vec];co[++lc]=vec;}
			for(l=1;l<=lc;l++)dad[co[l]]=vec;
			if(dad[f[Q[j]]]==dad[s[Q[j]]]){sol[Q[j]]=val;Q[j]=Q[pr];pr++;}
		}
	}
	for(i=1;i<=q;i++)printf("%d\n",sol[i]);
}
void Graph()
{
	int nn=n*n-n;
	for(i=0;i<=nn;i+=n)for(j=1;j<n;j++){R[i+j]=i+j+1;L[i+j+1]=i+j;}
	for(i=1;i<=nn;i++){D[i]=i+n;U[i+n]=i;}
}
int ca(int p1,int p2)
{
	if(a[p1]>a[p2])return 1;return 0;
}
int cv(int p1,int p2)
{
	if(v[p1]>v[p2])return 1;return 0;
}
void enque()
{
	for(;;)
	{
		co[++lc]=vec;
		if(dad[vec]==vec)
		{
			root=(root<vec)?root:vec;
			return;
		}
		vec=dad[vec];
	}
}