Pagini recente » Cod sursa (job #1830432) | Cod sursa (job #2413845) | Cod sursa (job #2250945) | Cod sursa (job #1239869) | Cod sursa (job #1877040)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
#define mp make_pair
#define f first
#define s second
int w[305][305];
int t[900005];
pair<pair<int,int> ,pair<int,int> >q[20010];
pair<int,pair<int,int> > v[900005];
int ans[20010];
int n,qr;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int i,j,mx;
int root(int x)
{
if(!t[x])
return x;
t[x]=root(t[x]);
return t[x];
}
inline int convert(int x,int y)
{
return (x-1)*n+y;
}
void bs(int ls,int ld)
{
if(ls>ld)
return;
int m = (ls+ld)>>1;
memset(t,0,sizeof(t));
memset(w,0,sizeof(w));
int a,b;
for(int i=n*n; v[i].f>=m; --i)
{
a = v[i].s.f;
b = v[i].s.s;
w[a][b]=1;
for(int k=0; k<4; ++k)
if(w[a+dx[k]][b+dy[k]])
{
if(root(convert(a+dx[k],b+dy[k]))!=root(convert(a,b)))
t[root(convert(a,b))]=root(convert(a+dx[k],b+dy[k]));
}
}
int ok1=0;
int ok2=0;
for(int i=1; i<=qr; ++i)
{
if(root(convert(q[i].f.f,q[i].f.s))==root(convert(q[i].s.f,q[i].s.s)))
{
ans[i]=max(ans[i],m);
ok2=1;
}
else
ok1=1;
}
if(ok1)
bs(ls,m-1);
if(ok2)
bs(m+1,ld);
}
int main()
{
fin>>n>>qr;
int k=0;
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
{
int x;
fin>>x;
v[++k]=mp(x,mp(i,j));
mx=max(mx,x);
}
sort(v+1,v+n*n+1);
for(i=1; i<=qr; ++i)
fin>>q[i].f.f>>q[i].f.s>>q[i].s.f>>q[i].s.s;
bs(1,mx);
for(i=1; i<=qr; ++i)
fout<<ans[i]<<'\n';
}