Pagini recente » Cod sursa (job #2192377) | Cod sursa (job #2451108) | Cod sursa (job #3224627) | Cod sursa (job #1498922) | Cod sursa (job #3184169)
#include <fstream>
#include <algorithm>
#include <vector>
#define ll long long
using namespace std;
const int NMAX = 300;
const int QMAX = 20000;
int v[NMAX + 1][NMAX + 1];
vector <pair <int, int> > poz[NMAX * NMAX + 1];
struct ob
{
int i1, j1, i2, j2;
int ans;
};
ob query[QMAX + 1];
int n;
bool active[NMAX + 1][NMAX + 1];
int viz[NMAX + 1][NMAX + 1];
vector <int> norm;
int cnt;
int normalize()
{
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
norm.push_back(v[i][j]);
sort(norm.begin(), norm.end());
norm.resize(unique(norm.begin(), norm.end()) - norm.begin());
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
v[i][j] = lower_bound(norm.begin(), norm.end(), v[i][j]) - norm.begin();
poz[v[i][j]].push_back({i, j});
}
return norm.size();
}
int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};
void dfs(int i, int j, int val)
{
viz[i][j] = val;
for (int k = 0; k < 4; k++)
{
int ni = i + di[k];
int nj = j + dj[k];
if (ni >= 1 and ni <= n and nj >= 1 and nj <= n and viz[ni][nj] == 0
and active[ni][nj])
dfs(ni, nj, val);
}
}
void bs(int st, int dr, vector <int> &ceva)
{
if (st > dr)
return ;
int i, med = ((st + dr) >> 1);
/*if (med == 5)
cout << "";*/
vector <pair <int, int> > who;
for (i = med; i <= cnt; i++)
{
for (pair <int, int> x : poz[i])
{
active[x.first][x.second] = 1;
who.push_back(x);
}
}
int aux = 0;
for (pair <int, int> x : who)
if (!viz[x.first][x.second])
{
aux++;
dfs(x.first, x.second, aux);
}
vector <int> good, bad;
for (int x : ceva)
if (viz[query[x].i1][query[x].j1] == viz[query[x].i2][query[x].j2]
and viz[query[x].i1][query[x].j1] != 0)
{
query[x].ans = norm[med];
good.push_back(x);
}
else
bad.push_back(x);
for (i = med; i <= cnt; i++)
{
for (pair <int, int> x : poz[i])
{
active[x.first][x.second] = 0;
viz[x.first][x.second] = 0;
}
}
bs(st, med - 1, bad);
bs(med + 1, dr, good);
}
signed main()
{
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
int i, j, q;
cin >> n >> q;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
cin >> v[i][j];
}
cnt = normalize();
vector <int> qs;
for (i = 1; i <= q; i++)
{
cin >> query[i].i1 >> query[i].j1 >> query[i].i2 >> query[i].j2;
qs.push_back(i);
}
bs(0, cnt - 1, qs);
for (i = 1; i <= q; i++)
cout << query[i].ans << "\n";
}