Pagini recente » Cod sursa (job #2346331) | Cod sursa (job #2373150) | Cod sursa (job #676446) | Cod sursa (job #899545) | Cod sursa (job #2391432)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
typedef pair<int,int> Pair;
typedef pair<int,Pair> Pair2;
const int N=309,K=20009;
Pair v[N*N];
Pair2 q[K];
int t[N*N],r[N*N],ans[K],prez[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int n,k,Max;
int cmp(Pair2 x,Pair2 y)
{
return ans[x.first]>ans[y.first];
}
bool verif(int x,int y)
{
if(prez[x][y]==0)
return false;
return true;
}
int root(int x)
{
int y=x;
for(y=x;y!=t[y];y=t[y]);
for(;x!=t[x];)
{
int z=t[x];
t[x]=y;
x=z;
}
return y;
}
void unite(int x,int y)
{
if(r[x]>r[y])
t[y]=x;
else
t[x]=y;
if(r[x]==r[y])
r[y]++;
}
void solve()
{
sort(v+1,v+n*n+1);
int step;
for(step=1;step<Max;step<<=1);
for(;step;step>>=1)
{
sort(q+1,q+k+1,cmp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
prez[i][j]=0;
for(int i=1;i<=n*n;i++)
r[i]=1,t[i]=i;
int last=n*n;
for(int i=1;i<=k;i++)
{
while(v[last].first>=ans[q[i].first]+step)
{
int x=v[last].second/n+1,y=v[last].second%n;
if(y==0)
x--,y=n;
prez[x][y]=1;
for(int j=0;j<4;j++)
{
if(verif(x+dx[j],y+dy[j])==true)
{
int X=root((x-1)*n+y),Y=root((x+dx[j]-1)*n+y+dy[j]);
if(X!=Y)
unite(X,Y);
}
}
last--;
}
int X=root(q[i].second.first),Y=root(q[i].second.second);
if(X==Y)
ans[q[i].first]+=step;
}
}
}
int main()
{
fin>>n>>k;
int nr=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;
fin>>x;
Max=max(Max,x);
nr++;
v[nr]={x,nr};
}
for(int i=1;i<=k;i++)
{
int x,y,z,w;
fin>>x>>y>>z>>w;
q[i]={i,{(x-1)*n+y,(z-1)*n+w}};
}
solve();
for(int i=1;i<=k;i++)
fout<<ans[i]<<'\n';
return 0;
}