Pagini recente » Cod sursa (job #2529143) | Cod sursa (job #338275) | Cod sursa (job #1955411) | Cod sursa (job #3216125) | Cod sursa (job #2812885)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin ("matrice2.in");
ofstream fout ("matrice2.out");
int a[302][302];
struct el
{
int l, c, val;
} s[90001];
bool comp (const el &a, const el &b)
{
return a.val > b.val;
}
int t[90001], h[90001];
int cauta (int x);
void uneste (int x, int y);
struct idk
{
int l1, c1, l2, c2;
int rasp;
} intr[20001];
vector <int> prag[301];
bool fol[20001];
int main()
{
int n, q, i, j, la, ca, lv, cv, x, y;
int dl[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0, -1};
fin >> n >> q;
for (i = 1; i<=n; i++)
for (j = 1; j<=n; j++)
{
fin >> a[i][j];
s[(i-1)*n+j] = {i, j, a[i][j]};
}
for (i = 1; i<=q; i++)
fin >> intr[i].l1 >> intr[i].c1 >> intr[i].l2 >> intr[i].c2;
sort (s+1, s+n*n+1, comp);
for (i = 1; i<=n*n; i++)
{
la = s[i].l;
ca = s[i].c;
for (j = 0; j<4; j++)
{
lv = la + dl[j];
cv = ca + dc[j];
if (lv >= 1 && lv <= n && cv >= 1 && cv <= n && a[lv][cv] >= s[i].val)
{
x = cauta ((la-1)*n+ca);
y = cauta ((lv-1)*n+cv);
if (x != y)
uneste (x, y);
}
}
if (i % n == 0)
{
for (j = 1; j<=q; j++)
if (fol[j] == 0 && cauta ((intr[j].l1-1)*n + intr[j].c1) == cauta ((intr[j].l2-1)*n + intr[j].c2))
{
cout << s[i].val << ' ' << j << endl;
prag[i/n-1].push_back (j);
fol[j] = 1;
}
}
}
for (i = 1; i<=n*n; i++)
t[i] = h[i] = 0;
for (i = 1; i<=q; i++)
fol[i] = 0;
for (i = 1; i<=n*n; i++)
{
la = s[i].l;
ca = s[i].c;
for (j = 0; j<4; j++)
{
lv = la + dl[j];
cv = ca + dc[j];
if (lv >= 1 && lv <= n && cv >= 1 && cv <= n && a[lv][cv] >= s[i].val)
{
x = cauta ((la-1)*n+ca);
y = cauta ((lv-1)*n+cv);
if (x != y)
uneste (x, y);
}
}
x = i/n - (i%n == 0);
for (j = 0; j<prag[x].size(); j++)
{
y = prag[x][j];
if (fol[y] == 0 && cauta ((intr[y].l1-1)*n + intr[y].c1) == cauta ((intr[y].l2-1)*n + intr[y].c2))
{
intr[y].rasp = s[i].val;
fol[y] = 1;
}
}
}
for (i = 1; i<=q; i++)
fout << intr[i].rasp << '\n';
return 0;
}
int cauta (int x)
{
int r = x, y;
while (t[r])
r = t[r];
while (x != r)
{
y = t[x];
t[x] = r;
x = y;
}
return r;
}
void uneste (int x, int y)
{
if (h[x] < h[y])
t[x] = y;
else
{
t[y] = x;
if (h[x] == h[y])
h[x]++;
}
}