Pagini recente » Cod sursa (job #1713470) | Cod sursa (job #2979986) | Cod sursa (job #396755) | Cod sursa (job #2043470) | Cod sursa (job #1473441)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
const int NMAX = 300 + 10;
const int QMAX = 20000 + 10;
int i , j , c , N , Q , xx , xy , yx , yy , k , u , t;
int id[NMAX][NMAX] , blocked[NMAX][NMAX];
int dad[NMAX * NMAX];
vector < pair < pair < pair < int , int > , pair < int , int > > , int > > queries;
vector < pair < int , pair < int , int > > > w;
int ans[QMAX];
int where(int x)
{
int rang;
rang = (dad[x] == x) ? x : where(dad[x]);
dad[x] = rang;
return rang;
}
int main()
{
fin >> N >> Q;
for (i = 1 ; i <= N ; ++i)
for (j = 1 ; j <= N ; ++j)
{
fin >> c;
w.push_back({-c , {i , j}});
id[i][j] = (i - 1) * N + j;
dad[id[i][j]] = id[i][j];
blocked[i][j] = true;
}
for (i = 1 ; i <= Q ; ++i)
{
fin >> xx >> xy >> yx >> yy;
queries.push_back({{{xx , xy} , {yx , yy}} , i});
}
sort(w.begin() , w.end());
for (k = 0 , u = 0 ; k < w.size() ; )
{
c = -w[k].first;
while (w[k].first == -c)
{
i = w[k].second.first;
j = w[k].second.second;
blocked[i][j] = false;
if (blocked[i - 1][j] == false && i >= 2)
dad[where(id[i - 1][j])] = dad[id[i][j]];
if (blocked[i][j - 1] == false && j >= 2)
dad[where(id[i][j - 1])] = dad[id[i][j]];
if (blocked[i + 1][j] == false && i <= N - 1)
dad[where(id[i + 1][j])] = dad[id[i][j]];
if (blocked[i][j + 1] == false && j <= N - 1)
dad[where(id[i][j + 1])] = dad[id[i][j]];
k += 1;
}
for (t = u ; t < queries.size() ; ++t)
if (where(id[queries[t].first.first.first][queries[t].first.first.second]) ==
where(id[queries[t].first.second.first][queries[t].first.second.second]))
{
ans[queries[t].second] = c;
swap(queries[t] , queries[u]);
u += 1;
}
}
for (i = 1 ; i <= Q ; ++i)
cout << ans[i] << '\n';
return 0;
}