Pagini recente » Cod sursa (job #3240608) | Cod sursa (job #3212180) | Cod sursa (job #1440903) | Cod sursa (job #2959723) | Cod sursa (job #3039517)
#include <fstream>
#include <cstring>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
using ll = long long;
//#define int ll
using pi = pair<int,int>;
using pll = pair<ll, ll>;
#define pb push_back
#define x first
#define y second
const int MOD = 1e9+7, INF = 1e9, NMAX = 305, QMAX = 20005;
int a[NMAX][NMAX], comp[NMAX*NMAX], pos[NMAX][NMAX], ans[QMAX];
vector<int> v[NMAX * NMAX];
map<pi, int> mp;
struct lol
{
int i, j, val;
};
bool cmp(const lol &a, const lol &b)
{
return a.val > b.val;
}
vector<lol> vec;
void join(int a, int b, int val)
{
if(comp[a] == comp[b])
return;
if(v[comp[a]].size() < v[comp[b]].size())
swap(a, b);
for(int i = 0; i < v[comp[b]].size(); i++)
{
for(int j = 0; j < v[comp[a]].size(); j++)
{
if(mp[{v[comp[a]][j], v[comp[b]][i]}])
{
ans[mp[{v[comp[a]][j], v[comp[b]][i]}]] = val;
}
}
}
int aux = comp[b];
for(int i = 0; i < v[comp[b]].size(); i++)
v[comp[a]].pb(v[comp[b]][i]);
for(int i = 0; i < v[aux].size(); i++)
comp[v[aux][i]] = comp[a];
v[aux].clear();
}
void solve()
{
ll n, i, q, j, cnt = 0, x1, y1, x2, y2;
cin >> n >> q;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
cin >> a[i][j];
pos[i][j] = ++cnt;
comp[pos[i][j]] = cnt;
v[cnt].pb(pos[i][j]);
vec.pb({i, j, a[i][j]});
}
for(i = 1; i <= q; i++)
{
cin >> x1 >> y1 >> x2 >> y2;
mp[{pos[x1][y1], pos[x2][y2]}] = mp[{pos[x2][y2], pos[x1][y1]}] = i;
}
sort(vec.begin(), vec.end(), cmp);
for(i = 0; i < vec.size(); i++)
{
lol u = vec[i];
int posu = pos[u.i][u.j];
if(u.i != 1 && a[u.i-1][u.j] >= u.val)
join(pos[u.i-1][u.j], posu, u.val);
if(u.j != 1 && a[u.i][u.j-1] >= u.val)
join(pos[u.i][u.j-1], posu, u.val);
if(u.i != n && a[u.i+1][u.j] >= u.val)
join(pos[u.i+1][u.j], posu, u.val);
if(u.j != n && a[u.i][u.j+1] >= u.val)
join(pos[u.i][u.j+1], posu, u.val);
}
for(i = 1; i <= q; i++)
cout << ans[i] << '\n';
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cin.exceptions(cin.failbit);
int T;
T = 1;
while(T--)
solve();
return 0;
}