Pagini recente » Cod sursa (job #1286455) | Cod sursa (job #3243809) | Cod sursa (job #3226850) | Cod sursa (job #1578472) | Cod sursa (job #2862927)
#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;
}
}s[dim*dim];
bool in(int i,int j){
return 1<=i&&i<=n&&1<=j&&j<=n;
}
struct query{
int x1,y1,x2,y2;
}q[dim*dim];
int st[dim*dim],dr[dim*dim],mij[dim*dim];
vector<int>verif[dim*dim];
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;
s[nr[i][j]]={v[i][j],i,j};
}
}
sort(s+1,s+n*n+1);
for(int i=1;i<=Q;i++){
fin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2;
st[i]=n*n;
dr[i]=1;
}
for(int it=1;(1<<(it-1))<n*n;it++){
for(int i=1;i<=n*n;i++){
parent[i]=i;
sz[i]=1;
verif[i].clear();
}
for(int i=1;i<=Q;i++){
if(st[i]>=dr[i]){
mij[i]=(st[i]+dr[i])/2;
verif[mij[i]].push_back(i);
}
}
for(int t=1;t<=n*n;t++){
int i=s[t].i;
int j=s[t].j;
for(int l=0;l<4;l++){
int inou=i+dx[l];
int jnou=j+dy[l];
if(in(inou,jnou)&&v[inou][jnou]>=s[t].v){
if(find_set(nr[inou][jnou])!=find_set(nr[i][j])){
union_sets(nr[inou][jnou],nr[i][j]);
}
}
}
for(int x:verif[t]){
if(find_set(nr[q[x].x1][q[x].y1])==find_set(nr[q[x].x2][q[x].y2])){
st[x]=mij[x]-1;
}else{
dr[x]=mij[x]+1;
}
}
}
}
for(int i=1;i<=Q;i++){
fout<<s[dr[i]].v<<'\n';
}
}