Pagini recente » Cod sursa (job #1366866) | Cod sursa (job #17813) | Cod sursa (job #1147074) | Cod sursa (job #1310685) | Cod sursa (job #3267239)
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ull unsigned long long
#define ld long double
#define chad char
#define mod 1'000'000'007
#define dim 100005
#define lim 1000000
#define BASE 31
#define NMAX 21'005
#define FOR(i,a,b) for(int i=(a); i<=(b); i++)
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define nr_biti __builtin_popcount
using namespace __gnu_pbds;
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int t=1;
int n,q;
int a[303][303];
struct intre
{
int x1,y1,x2,y2;
}qs[20002];
int ans[20002];
vector<pair<int,pii> > v;
struct dsu
{
vector<int> t;
vector<int> sz;
void init(int n)
{
t=vector<int>(n+3,0);
sz=vector<int>(n+3,0);
for(int i=1; i<=n; i++)
{
t[i]=i;
sz[i]=1;
}
}
int root(int x)
{
if(x==t[x])
return x;
return t[x]=root(t[x]);
}
void unite(int x,int y)
{
x=root(x);
y=root(y);
if(x==y)
return;
if(sz[x]<sz[y])
swap(x,y);
sz[x]+=sz[y];
t[y]=x;
}
}dd;
bool used[303][303];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool in(int i,int j)
{
return min(i,j)>=1 && max(i,j)<=n;
}
void solve()
{
fin >> n >> q;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
fin >> a[i][j];
v.pb(mp(a[i][j],mp(i,j)));
}
}
for(int i=1; i<=q; i++)
fin >> qs[i].x1 >> qs[i].y1 >> qs[i].x2 >> qs[i].y2;
dd.init(n*n);
sort(v.begin(),v.end(),greater<pair<int,pii> >());
for(int i=0; i<n*n; i++)
{
used[v[i].second.first][v[i].second.second]=1;
for(int d=0; d<4; d++)
{
int xn=v[i].second.first+dx[d];
int yn=v[i].second.second+dy[d];
if(!in(xn,yn))
continue;
if(used[xn][yn])
dd.unite(n*(xn-1)+yn,(v[i].second.first-1)*n+v[i].second.second);
}
for(int j=1; j<=q; j++)
{
if(dd.root(n*(qs[j].x1-1)+qs[j].y1)==dd.root(n*(qs[j].x2-1)+qs[j].y2))
ans[j]=max(ans[j],v[i].first);
}
}
for(int i=1; i<=q; i++)
fout << ans[i] << "\n";
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(nullptr);
fout.tie(nullptr);
//cin >> t;
while(t--)
solve();
return 0;
}