Pagini recente » Istoria paginii runda/easylasmdp | Monitorul de evaluare | Cod sursa (job #1171556) | Cod sursa (job #289056) | Cod sursa (job #1081353)
#include <fstream>
#include <iostream>
#include <math.h>
#include <queue>
using namespace std;
int n, m, x1, x2, y2, i, j, a[305][305], y, sol;
typedef struct str{int x; int y;};
typedef struct str2{int x; int y; int val;};
str2 s;
str aux, aux2;
queue<str> q, r;
queue<str2> q2;
bool verific(int nr)
{
int i, j;
//cout<<nr<<" "<<x1<<" "<<y<<" "<<a[x1][y]<<"\n";
if(a[x1][y]>=nr && a[x2][y2])
{
aux.x=x1;
aux.y=y;
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q.push(aux);
a[aux.x][aux.y] = -1;
q2.push(s);
aux.x=x2;
aux.y=y2;
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
r.push(aux);
a[aux.x][aux.y] = -2;
q2.push(s);
while(!q.empty() && !r.empty())
{
aux2=q.front();
q.pop();
if(a[aux2.x-1][aux2.y] == -2 || a[aux2.x+1][aux2.y] == -2 || a[aux2.x][aux2.y-1] == -2 || a[aux2.x][aux2.y+1] == -2 )
{
while(!q.empty())
q.pop();
while(!r.empty())
r.pop();
while(!q2.empty())
{
s=q2.front();
q2.pop();
a[s.x][s.y]=s.val;
}
return true;
}
if( a[aux2.x-1][aux2.y] >= nr )
{
aux.x=aux2.x-1;
aux.y=aux2.y;
q.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-1;
}
if( a[aux2.x+1][aux2.y] >= nr )
{
aux.x=aux2.x+1;
aux.y=aux2.y;
q.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-1;
}
if( a[aux2.x][aux2.y-1] >= nr )
{
aux.x=aux2.x;
aux.y=aux2.y-1;
q.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-1;
}
if( a[aux2.x][aux2.y+1] >= nr )
{
aux.x=aux2.x;
aux.y=aux2.y+1;
q.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-1;
}
aux2=r.front();
r.pop();
if(a[aux2.x-1][aux2.y] == -1 || a[aux2.x+1][aux2.y] == -1 || a[aux2.x][aux2.y-1] == -1 || a[aux2.x][aux2.y+1] == -1 )
{
while(!q.empty())
q.pop();
while(!r.empty())
r.pop();
while(!q2.empty())
{
s=q2.front();
q2.pop();
a[s.x][s.y]=s.val;
}
return true;
}
if( a[aux2.x-1][aux2.y] >= nr )
{
aux.x=aux2.x-1;
aux.y=aux2.y;
r.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-2;
}
if( a[aux2.x+1][aux2.y] >= nr )
{
aux.x=aux2.x+1;
aux.y=aux2.y;
r.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-2;
}
if( a[aux2.x][aux2.y-1] >= nr )
{
aux.x=aux2.x;
aux.y=aux2.y-1;
r.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-2;
}
if( a[aux2.x][aux2.y+1] >= nr )
{
aux.x=aux2.x;
aux.y=aux2.y+1;
r.push(aux);
s.x=aux.x;
s.y=aux.y;
s.val=a[aux.x][aux.y];
q2.push(s);
a[aux.x][aux.y]=-2;
}
}
while(!q2.empty())
{
s=q2.front();
q2.pop();
a[s.x][s.y]=s.val;
}
}
return false;
}
void bin(int l, int r) ///////////
{
int m = (l+r)/2;
//cout<<"MIJLOCUL: "<<l<<" "<<r<<" "<<m<<"\n\n";
if(l > r)
return;
if(verific(m))
{
sol = m;
bin(m+1, r);
}
else
bin(l, m-1);
}
int main()
{
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
fin>>n>>m;
for(i = 1; i<=n; i++ )
for( j=1; j<=n; j++ )
fin>>a[i][j];
for(i=1; i<= m ; i++ )
{
fin>>x1>>y>>x2>>y2;
bin(1, min(a[x1][y], a[x2][y2]));
fout<<sol<<"\n";
}
return 0;
}