Pagini recente » Cod sursa (job #2060077) | Cod sursa (job #968956) | Cod sursa (job #2687001) | Cod sursa (job #3226301) | Cod sursa (job #2862859)
#include <bits/stdc++.h>
using namespace std;
const int dim=309,inf=1e6;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};
int n,q;
int v[dim][dim];
int nr[dim][dim];
int parent[dim*dim],sz[dim*dim];
int find_set(int x){
if(x==parent[x]){
return x;
}
return parent[x]=find_set(parent[x]);
}
void union_sets(int x,int y){
int a=find_set(x);
int b=find_set(y);
if(a!=b){
if(sz[a]<sz[b]){
swap(a,b);
}
parent[b]=a;
sz[a]+=sz[b];
}
}
struct elem{
int v,i,j;
bool operator<(const elem &other) const{
return v>other.v;
}
};
vector<elem>w;
bool in(int i,int j){
return 1<=i&&i<=n&&1<=j&&j<=n;
}
bool verifica(int x1,int y1,int x2,int y2,int h){
for(int i=1;i<=n*n;i++){
parent[i]=i;
sz[i]=1;
}
for(elem it:w){
int val=it.v,i=it.i,j=it.j;
if(val<h){
break;
}
for(int l=0;l<4;l++){
int inou=i+dx[l],jnou=j+dy[l];
if(in(inou,jnou)&&v[i][j]<=v[inou][jnou]){
if(find_set(nr[i][j])!=find_set(nr[inou][jnou])){
union_sets(nr[i][j],nr[inou][jnou]);
}
}
}
}
if(find_set(nr[x1][y1])==find_set(nr[x2][y2])){
return true;
}
return false;
}
signed main(){
fin>>n>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
fin>>v[i][j];
nr[i][j]=(i-1)*n+j;
w.push_back({v[i][j],i,j});
}
}
sort(w.begin(),w.end());
while(q--){
int x1,x2,y1,y2;
fin>>x1>>y1>>x2>>y2;
int st=1,dr=inf,retine=0;
while(st<=dr){
int mij=(st+dr)/2;
if(verifica(x1,y1,x2,y2,mij)){
retine=mij;
st=mij+1;
}else{
dr=mij-1;
}
}
fout<<retine<<'\n';
}
}