Pagini recente » Cod sursa (job #3126348) | Cod sursa (job #2178161) | Cod sursa (job #2197667) | Cod sursa (job #1802275) | Cod sursa (job #2862928)
#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;
}
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;
w.push_back({v[i][j],i,j});
}
}
sort(w.begin(),w.end());
for(int i=1;i<=Q;i++){
fin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2;
st[i]=1;
dr[i]=n*n;
}
bool changed=true;
while(changed){
changed=false;
for(int i=0;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);
changed=true;
}
}
for(int s=0;s<n*n;s++){
int i=w[s].i;
int j=w[s].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]>=v[i][j]){
if(find_set(nr[inou][jnou])!=find_set(nr[i][j])){
union_sets(nr[inou][jnou],nr[i][j]);
}
}
}
for(int x:verif[s]){
if(find_set(nr[q[x].x1][q[x].y1])==find_set(nr[q[x].x2][q[x].y2])){
dr[x]=mij[x]-1;
}else{
st[x]=mij[x]+1;
}
}
}
}
for(int i=1;i<=Q;i++){
fout<<w[dr[i]].v<<'\n';
}
}