Pagini recente » Cod sursa (job #2218011) | Cod sursa (job #347954) | Cod sursa (job #2179243) | Cod sursa (job #1390505) | Cod sursa (job #327279)
Cod sursa(job #327279)
#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;
}