Cod sursa(job #327279)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 28 iunie 2009 01:21:57
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

#define file_in "matrice2.in"
#define file_out "matrice2.out"

#define vi vector<int>
#define vii vector<int> :: iterator

#define Nmax 310

#define pb push_back
#define clear(x) memset(x,0,sizeof(x))

int n,m;
int t[50][Nmax*Nmax];
int tata[Nmax*Nmax];
int viz[Nmax*Nmax];
vi v[Nmax*Nmax];
int niv[Nmax*Nmax],nr;
int x1,x2,y1,y2;
int a[Nmax*Nmax];
int poz[Nmax*Nmax],mmax;


void dfs(int nod)
{
 vector<int> :: iterator it;
 niv[nod]=niv[t[0][nod]]+1;
 
 for (it=v[nod].begin();it<v[nod].end();++it)
		 dfs(*it);
}

bool cmp(int x, int y) 
{ 
	return (a[x]>a[y]); 
}

int father(int nod)
{
 if (tata[nod]==nod) 
	 return tata[nod];
 return tata[nod]=father(tata[nod]);
}

void mult_dis()
{
	int x,nod;
	
	for (int i=1;i<=nr;++i)
	{
	  nod=poz[i];
	  viz[nod]=1;
	  if (viz[nod-1] && (nod-1)%n)
		  {
			x=father(nod-1);
			if (x!=nod)
				{ t[0][x]=nod;
		  	      tata[x]=nod;}
				 v[nod].pb(x);
		  }
	  if (viz[nod-n] && nod>n)
		  {
			 x=father(nod-n);
			 if (x!=nod)
				{ t[0][x]=nod;
			     tata[x]=nod;
				 v[nod].pb(x);}
		  }
	  if (viz[nod+1] && nod%n)
		  {
			 x=father(nod+1);
			 if (x!=nod)
				{ t[0][x]=nod;
			     tata[x]=nod,
				 v[nod].pb(x);}
		  }
	  if (viz[nod+n] && nod+n<=nr)
		  {
			 x=father(nod+n);
			 if (x!=nod)
				{ t[0][x]=nod;
			     tata[x]=nod,
				 v[nod].pb(x);}
		  }
	 }
	
}

void str()
{
	int k;
	for (k=1;(1<<k)<=nr;++k)
		 for (int i=1;i<=nr;++i)
			   t[k][i]=t[k-1][t[k-1][i]];
	mmax=k;	 
}
	

int lca(int a, int b)
{
	
	int k=mmax;
    int k1=mmax;
	//dfs(poz[nr]);
	if (niv[a]<niv[b])
		swap(a,b);
	int x=a;
	while(k!=0)
	{
		if (niv[t[k-1][x]]>=niv[b])
			x=t[k-1][x];
		k-=1;
	}
	a=x;
	while(k1!=0)
	{
		if (t[k1-1][a]!=t[k1-1][b])
		{
			a=t[k1-1][a];
			b=t[k1-1][b];
		}
		k1-=1;
	}
	if (a!=b) return t[0][a];
	return a;
}

	 

int main()
{
	int x;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&m);
	
	nr=0;
	for (int i=1;i<=n;++i)
		 for (int j=1;j<=n;++j)
		 {
			 scanf("%d", &x);
			 nr++;
			 poz[nr]=nr;
			 a[nr]=x;
			 tata[nr]=nr;
		 }
		 
	sort(poz+1,poz+nr+1,cmp);
    mult_dis();
	str();
	dfs(poz[nr]);
	while(m--)
	{
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
	    printf("%d\n", a[lca((x1-1)*n+y1,(x2-1)*n+y2)]);
	}
	
	//for (int i=1;i<=nr;++i)
	// printf("%d ", tata[i]);
	//printf("\n");
	//for (int i=1;i<=nr;++i)
	//	 printf("%d ", poz[i]);
	//printf("\n");
	//for (int i=1;i<=nr;++i)
   	//	 printf("%d ", niv[i]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}