Pagini recente » Cod sursa (job #2847544) | Cod sursa (job #17638) | Cod sursa (job #2006101) | Cod sursa (job #1224846) | Cod sursa (job #3185963)
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <iomanip>
#define ll long long
using namespace std;
const int NMAX = 300;
const int QMAX = 20000;
int v[NMAX + 1][NMAX + 1];
int ans[QMAX + 1];
int n;
int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};
set <int> s[NMAX + 1][NMAX + 1];
bool active[NMAX + 1][NMAX + 1];
pair <int, int> ds[NMAX * NMAX + 1];
bool cmp(pair <int, int> a, pair <int, int> b)
{
return v[a.first][a.second] > v[b.first][b.second];
}
pair <int, int> tata[NMAX + 1][NMAX + 1];
pair <int, int> dad(int a, int b)
{
if (tata[a][b] == make_pair(a, b))
return make_pair(a, b);
tata[a][b] = dad(tata[a][b].first, tata[a][b].second);
return tata[a][b];
}
void combine(pair <int, int> a, pair <int, int> b)
{
int val = v[a.first][a.second];
a = dad(a.first, a.second);
b = dad(b.first, b.second);
if (a == b)
return ;
pair <int, int> delacine, unde;
if (s[a.first][a.second].size() > s[b.first][b.second].size())
{
delacine = b;
unde = a;
}
else
{
delacine = a;
unde = b;
}
tata[delacine.first][delacine.second] = unde;
for (int x : s[delacine.first][delacine.second])
{
if (s[unde.first][unde.second].find(x) != s[unde.first][unde.second].end())
{
ans[x] = val;
s[unde.first][unde.second].erase(x);
}
else
s[unde.first][unde.second].insert(x);
}
s[delacine.first][delacine.second].clear();
}
void joint(int a, int b)
{
int k;
for (k = 0; k < 4; k++)
{
int ni = a + di[k];
int nj = b + dj[k];
if (ni >= 1 and ni <= n and nj >= 1 and nj <= n and active[ni][nj])
combine(make_pair(a, b), make_pair(ni, nj));
}
}
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
signed main()
{
int i, j, q;
cin >> n >> q;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
cin >> v[i][j];
tata[i][j] = {i, j};
ds[(i - 1) * n + j] = {i, j};
}
for (i = 1; i <= q; i++)
{
int i1, j1, i2, j2;
cin >> i1 >> j1 >> i2 >> j2;
s[i1][j1].insert(i);
s[i2][j2].insert(i);
}
sort(ds + 1, ds + 1 + n * n, cmp);
for (i = 1; i <= n * n; i++)
{
joint(ds[i].first, ds[i].second);
active[ds[i].first][ds[i].second] = 1;
}
for (i = 1; i <= q; i++)
cout << ans[i] << "\n";
}