Pagini recente » Cod sursa (job #2072865) | Cod sursa (job #1271942) | Cod sursa (job #3281487) | Cod sursa (job #2784247) | Cod sursa (job #1135252)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define oo 2000000000
#define Nmax 310
#define pb push_back
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int N,T,a[Nmax][Nmax],b[Nmax][Nmax];
int dx[6]={0,0,0,-1,1},
dy[6]={0,1,-1,0,0};
bool inQ[Nmax][Nmax];
struct point {int x,y;}S,F;
queue < point > Q;
inline void ReadInput()
{
f>>N>>T;
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
f>>b[i][j];
}
inline bool Lee(point S,point F,int H)
{
if(b[S.x][S.y]<H || b[F.x][F.y]<H)return 0;
memcpy(a,b,sizeof(b));
int sol=0;
for( Q.push(S); !Q.empty() ; Q.pop() )
{
point curent=Q.front();
for(int k=1;k<=4;++k)
{
int p=curent.x+dx[k],q=curent.y+dy[k];
if(p>=1 && p<=N && q>=1 && q<=N && a[p][q]>=H)
{
if(p==F.x && q==F.y)sol=1;
a[p][q]=-1;
point A; A.x=p ,A.y=q;
Q.push(A);
}
}
}
return sol;
}
inline int Query(point S,point F)
{
int st=1,dr=max(b[S.x][S.y],b[F.x][F.y]),sol=0;
while(st<=dr)
{
int mij=(st+dr)>>1;
bool ok=Lee(S,F,mij);
if(ok)
{
if(mij>sol)sol=mij;
st=mij+1;
}
else dr=mij-1;
}
return sol;
}
int main()
{
ReadInput();
for(int i=1;i<=T;++i)
f>>S.x>>S.y>>F.x>>F.y , g<<Query(S,F)<<'\n';
f.close();g.close();
return 0;
}