Pagini recente » Cod sursa (job #723036) | Cod sursa (job #2830042) | Cod sursa (job #1816403) | Cod sursa (job #198014) | Cod sursa (job #2715858)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#define f first
#define s second
#define NMAX 300
#define MMAX 90000
#define inf 2000000000
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int curr, n, q, nr, m, v[NMAX+10][NMAX+10], tata[MMAX+10], rang[MMAX+10], ans[MMAX+10];
set <int> s1[MMAX+10], s2[MMAX+10];
struct date
{ int cost, n1, n2;
}K[2*MMAX+10];
int cell(int r, int c)
{ return (r - 1) * n + c;
}
bool mycmp(date a, date b)
{ return a.cost > b.cost;
}
int findDaddy(int x)
{ int y = x, r = x;
while(r != tata[r]) r = tata[r];
while(x != tata[x])
{ y = tata[x];
tata[x] = r;
x = y;
}
return r;
}
void unite(int x, int y)
{ if(s1[x].size() + s2[x].size() < s1[y].size() + s2[y].size()) swap(x, y);
for(set <int>::iterator it=s1[y].begin(); it!=s1[y].end(); it++)
s1[x].insert(*it);
for(set <int>::iterator it=s2[y].begin(); it!=s2[y].end(); it++)
s2[x].insert(*it);
for(set <int>::iterator it=s1[x].begin(); it!=s1[x].end();)
{ if(s2[x].count(*it))
{ ans[*it] = curr;
set <int>::iterator it1 = it;
it1++;
s1[x].erase(*it);
s2[x].erase(*it);
it = it1;
}
else it++;
}
tata[y] = x;
}
int main()
{
fin >> n >> q;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{ int nr1 = cell(i, j);
fin >> v[i][j];
if(i > 1)
{ int nr2 = cell(i - 1, j);
K[++nr] = {min(v[i][j], v[i-1][j]), nr1, nr2};
}
if(j > 1)
{ int nr2 = cell(i, j - 1);
K[++nr] = {min(v[i][j], v[i][j-1]), nr1, nr2};
}
tata[nr1] = nr1;
rang[nr1] = 1;
}
for(int i=1; i<=q; i++)
{ int x1, y1, x2, y2;
fin >> x1 >> y1 >> x2 >> y2;
int nr1 = cell(x1, y1), nr2 = cell(x2, y2);
s1[nr1].insert(i);
s2[nr2].insert(i);
}
sort(K+1, K+nr+1, mycmp);
for(int i=1; i<=nr; i++)
{ curr = K[i].cost;
int val1 = findDaddy(K[i].n1), val2 = findDaddy(K[i].n2);
if(val1 == val2) continue;
unite(val1, val2);
}
for(int i=1; i<=q; i++)
fout << ans[i] << '\n';
return 0;
}