Pagini recente » Cod sursa (job #729768) | Cod sursa (job #2827099) | Cod sursa (job #340326) | Cod sursa (job #3294586) | Cod sursa (job #2716162)
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <functional>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
const int NMAX = 105;
const int VMAX = 1000005;
struct cell {
int x, y;
};
vector<cell>v[VMAX];
bool f[VMAX];
int a[NMAX][NMAX];
bool viz[NMAX][NMAX];
bool x[NMAX][NMAX];
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
vector<int>sortedVals;
int n, q, k;
void read()
{
fin >> n >> q;
for(int i = 1; i <= n ; i++)
for (int j = 1; j <= n; j++)
{
fin >> a[i][j];
v[a[i][j]].push_back(cell({ i, j }));
if (f[a[i][j]] == 0)
f[a[i][j]] = 1, sortedVals.push_back(a[i][j]);
}
sort(sortedVals.begin(), sortedVals.end(),greater<int>());
k = sortedVals.size();
}
inline void add(int value)
{
for (int i = 0; i < v[value].size(); i++)
{
cell temp = v[value][i];
x[temp.x][temp.y] = 1;
}
}
void FIL(int xx, int yy)
{
viz[xx][yy] = true;
for (int i = 0; i < 4; i++)
{
int xi = xx + dx[i];
int yi = yy + dy[i];
if (!(xi >= 1 && xi <= n && yi >= 1 && yi <= n)) continue;
if (!viz[xi][yi] && x[xi][yi] == 1)
FIL(xi, yi);
}
}
bool isOk(int xi, int yi, int xf, int yf)
{
if (x[xi][yi] == 0 || x[xf][yf] == 0) return false;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
viz[i][j] = false;
FIL(xi, yi);
return viz[xf][yf];
}
bool verif(int med,int start,int xi,int yi,int xf,int yf)
{
int ending;
for (int i = start ; i < k; i++)
{
if (sortedVals[i] == med)
{
ending = i;
break;
}
}
for (int i = start + 1; i <= ending; i++)
add(sortedVals[i]);
return isOk(xi,yi,xf,yf);
}
int query(int& xi, int& yi, int& xf, int& yf)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
x[i][j] = 0;
int mi = min(a[xi][yi], a[xf][yf]);
int start;
for (int i = 0 ; i < k; i++)
{
if (sortedVals[i] == mi)
{
start = i;
break;
}
}
for (int i = 0; i <= start ; i++)
add(sortedVals[i]);
int st = sortedVals.back();
int dr = mi;
int med;
int ans = -1;
while (st <= dr)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
x[i][j] = 0;
for (int i = 0; i <= start; i++)
add(sortedVals[i]);
int med = (st + dr) / 2;
if (verif(med,start,xi,yi,xf,yf))
{
ans = med;
st = med + 1;
}
else
dr = med - 1;
}
return ans;
}
void solve()
{
while (q--)
{
int xi, yi, xf, yf;
fin >> xi >> yi >> xf >> yf;
fout << query(xi, yi, xf, yf) << '\n';
}
}
int main()
{
read();
solve();
return 0;
}