Pagini recente » Cod sursa (job #1060128) | Cod sursa (job #1750715) | Cod sursa (job #2493499) | Cod sursa (job #2694817) | Cod sursa (job #1403282)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
class citire
{
public:
citire(string file, int buffsz=32768):
buffer_size_(buffsz)
{
file_=fopen(file.c_str(), "r");buffer_=new char[buffsz];pointer_=buffer_+buffer_size_;
}
citire& operator>>(int &object)
{
object = 0;
while (next()<'0' or next()>'9')advance();
while (next()>='0' and next()<='9') {object=object*10 + next()-'0';advance();}
return *this;
}
private:
char next()
{
if (pointer_==buffer_+buffer_size_) {pointer_ = buffer_;fread(buffer_, 1, buffer_size_, file_);}
return *pointer_;
}
void advance() {++pointer_;}
FILE *file_;int buffer_size_;
char *buffer_, *pointer_;
};
citire f("matrice2.in");
ofstream g("matrice2.out");
int M, N, a[305][305], stx, sty, fnx, fny, dx[4]={-1, 0, 1, 0}, dy[4]={0, -1, 0, 1}, sol, vmax;
queue < pair <int, int> > Q;
int viz[305][305];
bool check(int val)
{
if (a[stx][sty]<val || a[fnx][fny]<val) return 0;
Q.push(make_pair(stx, sty));
memset(viz, 0, sizeof(viz));
viz[stx][sty]=1;
while (Q.size())
{
pair <int, int> nod=Q.front(); Q.pop();
for (int k=0; k<4; ++k)
{
int auxx=nod.first+dx[k], auxy=nod.second+dy[k];
if (a[auxx][auxy]>=val && !viz[auxx][auxy])
viz[auxx][auxy]=1, Q.push(make_pair(auxx, auxy));
}
}
return (viz[fnx][fny]);
}
int main()
{
f>>N>>M;
for (int i=1; i<=N; ++i)
for (int j=1; j<=N; ++j)
f>>a[i][j];
while (M--)
{
f>>stx>>sty>>fnx>>fny;
sol=0; vmax=max(a[stx][sty], a[fnx][fny]);
for (int i=(1<<20); i; i>>=1)
if (sol+i<=vmax && check(sol+i))
sol+=i;
g<<sol<<'\n';
}
return 0;
}