Pagini recente » Cod sursa (job #646567) | Cod sursa (job #1322117) | Cod sursa (job #354985) | Cod sursa (job #1818800) | Cod sursa (job #2630044)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
const int NMAX = 300;
const int QMAX = 20000;
int N, Q;
bool active[NMAX + 2][NMAX + 2];
pair <short int, short int> dad[NMAX + 2][NMAX + 2];
vector < pair <int, pair<short int, short int>> > fields;
vector <short int> qr[NMAX + 2][NMAX + 2];
int ans[QMAX + 2];
pair <short int, short int> Root(pair <short int, short int> field)
{
if(field == dad[field.first][field.second])
return field;
return dad[field.first][field.second] = Root(dad[field.first][field.second]);
}
void dojoin(pair <short int, short int> p, pair <short int, short int> q, int val)
{
p = Root(p);
q = Root(q);
if(p == q)
return;
dad[p.first][p.second] = q;
vector <short int> mergedVector;
int pp = 0, qq = 0;
while(pp < (int)qr[p.first][p.second].size() && qq < (int)qr[q.first][q.second].size())
{
if(qr[p.first][p.second][pp] == qr[q.first][q.second][qq])
ans[qr[p.first][p.second][pp]] = val, pp++, qq++;
else if(qr[p.first][p.second][pp] < qr[q.first][q.second][qq])
mergedVector.push_back(qr[p.first][p.second][pp]), pp++;
else
mergedVector.push_back(qr[q.first][q.second][qq]), qq++;
}
while(pp < (int)qr[p.first][p.second].size())
mergedVector.push_back(qr[p.first][p.second][pp]), pp++;
while(qq < (int)qr[q.first][q.second].size())
mergedVector.push_back(qr[q.first][q.second][qq]), qq++;
qr[p.first][p.second].clear();
qr[q.first][q.second] = mergedVector;
}
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
void join(pair <int, pair <short int, short int>> field)
{
int val = field.first;
short int x = field.second.first, y = field.second.second;
active[x][y] = 1;
for(int k = 0; k < 4; k++)
{
int xx = x + dx[k];
int yy = y + dy[k];
if(1 <= xx && xx <= N && 1 <= yy && yy <= N && active[xx][yy])
dojoin({x, y}, {xx, yy}, val);
}
}
int main()
{
cin >> N >> Q;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
{
int x;
cin >> x;
active[i][j] = false;
dad[i][j] = {i, j};
fields.push_back({x, {i, j}});
}
for(int i = 1; i <= Q; i++)
{
int x, y, z, t;
cin >> x >> y >> z >> t;
qr[x][y].push_back(i);
qr[z][t].push_back(i);
}
sort(fields.begin(), fields.end());
for(int i = fields.size() - 1; i >= 0; i--)
join(fields[i]);
for(int i = 1; i <= Q; i++)
cout << ans[i] << '\n';
return 0;
}