Pagini recente » Cod sursa (job #2063789) | Cod sursa (job #1726682) | Cod sursa (job #1458021) | Cod sursa (job #488484) | Cod sursa (job #2391750)
#include<bits/stdc++.h>
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int n, q;
vector<int>v[100002];
int a[302][302], nr[302][302], cod;
int ans[50002];
bool pus[302][302];
int tt[100002], rg[100002];
int val; // current value
int Find(int a)
{
if(tt[a] == a)
return a;
return tt[a] = Find(tt[a]);
}
void Union(int a, int b)
{
vector<int>z;
for(int j = 0; j < v[a].size(); ++j)
z.push_back(v[a][j]);
for(int j = 0; j < v[b].size(); ++j)
z.push_back(v[b][j]);
sort(z.begin(), z.end());
v[a].clear();
v[b].clear();
if(rg[a] > rg[b])
{
tt[b] = a, rg[a] += rg[b];
for(int i = 0; i < z.size(); ++i)
{
if(i+1 < z.size() && z[i] == z[i+1])
ans[z[i]] = val, ++i;
else
v[a].push_back(z[i]);
}
}
else
{
tt[a] = b, rg[b] += rg[a];
for(int i = 0; i < z.size(); ++i)
{
if(i+1 < z.size() && z[i] == z[i+1])
ans[z[i]] = val, ++i;
else
v[b].push_back(z[i]);
}
}
}
struct no
{
int L, C, val;
};
no zz[100002];
bool cmp(no a, no b)
{
return a.val < b.val;
}
int ox[] = {-1, 0, 1, 0};
int oy[] = {0, 1, 0, -1};
int main()
{
f >> n >> q;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
{
f >> a[i][j];
++cod;
nr[i][j] = cod;
zz[cod] = {i, j, a[i][j]};
}
sort(zz + 1, zz + cod + 1, cmp);
for(int i = 1; i <= cod; ++i)
tt[i] = i, rg[i] = 1;
for(int i = 1; i <= q; ++i)
{
int a, b, c, d;
f >> a >> b >> c >> d;
v[nr[a][b]].push_back(i);
v[nr[c][d]].push_back(i);
}
for(int i = cod; i >= 1; --i)
{
val = zz[i].val;
pus[zz[i].L][zz[i].C] = 1;
for(int j = 0; j <= 3; ++j)
{
int Lvecin = zz[i].L + ox[j];
int Cvecin = zz[i].C + oy[j];
if(pus[Lvecin][Cvecin] && Find(nr[zz[i].L][zz[i].C]) != Find(nr[Lvecin][Cvecin]))
Union(Find(nr[zz[i].L][zz[i].C]), Find(nr[Lvecin][Cvecin]));
}
}
for(int i = 1; i <= q; ++i)
g << ans[i] << '\n';
return 0;
}