Cod sursa(job #327278)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 28 iunie 2009 01:01:23
Problema Matrice 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 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)
{
 vii 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 x)
{
	while(x!=tata[x])
		 x=tata[x];
	return tata[x];
}


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

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]);
	//for (int i=1;i<=nr;++i)
		// printf("%d ", poz[i]);
	//for (int i=1;i<=nr;++i)
		// printf("%d ", niv[i]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}