Pagini recente » Cod sursa (job #249032) | Cod sursa (job #26215) | Cod sursa (job #932527) | Cod sursa (job #3267650)
#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;
set<int> s[90005];
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,int val)
{
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;
if(s[x].size()<s[y].size())
swap(s[x],s[y]);
for(auto it:s[y])
{
if(s[x].find(it)!=s[x].end())
{
ans[it]=val;
}
}
for(auto it:s[y])
s[x].insert(it);
s[y].clear();
}
}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);
for(int i=1; i<=q; i++)
{
int u=n*(qs[i].x1-1)+qs[i].y1;
dd.s[u].insert(i);
u=n*(qs[i].x2-1)+qs[i].y2;
dd.s[u].insert(i);
}
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])
continue;
dd.unite(n*(xn-1)+yn,n*(v[i].second.first-1)+v[i].second.second,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;
}