Pagini recente » Cod sursa (job #1080215) | Cod sursa (job #3163517) | Cod sursa (job #923315) | Cod sursa (job #580022) | Cod sursa (job #2697917)
#include <bits/stdc++.h>
using namespace std;
ifstream r("matrice2.in");
ofstream w("matrice2.out");
int n, qu, maxim, t[90003], fin[90003], val[90003];
vector<pair<int, int>>sol, q, v;
int tata(int a){
if(a!=t[a]){
t[a]=tata(t[a]);
}
return t[a];
}
int main()
{
r>>n>>qu;
int vec[]={-n, -1, 1, n};
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int x;
r>>x;
v.push_back(make_pair(x, i*n+j));
val[i*n+j]=x;
maxim=max(maxim, x);
}
}
sort(v.begin(), v.end());
for(int i=0;i<qu;i++){
sol.push_back(make_pair(0, i));
int a, b, c, d;
r>>a>>b>>c>>d;
q.push_back(make_pair((a-1)*n+b-1, (c-1)*n+d-1));
}
int put=1;
while(put*2<=maxim){
put*=2;
}
while(put!=0){
sort(sol.begin(), sol.end());
for(int i=0;i<n*n;i++){
t[i]=i;
}
int ind=n*n-1;
for(int i=sol.size()-1;i>=0;i--){
while(v[ind].first>=sol[i].first+put){
int a=v[ind].second;
for(int j=0;j<4;j++){
if(a+vec[j]<0 || a+vec[j]>=n*n){
continue;
}
if(val[a+vec[j]]>v[ind].first){
t[tata(a+vec[j])]=a;
}
}
ind--;
}
if(tata(q[sol[i].second].first)==tata(q[sol[i].second].second)){
sol[i].first+=put;
}
}
put/=2;
}
for(int i=0;i<qu;i++){
fin[sol[i].second]=sol[i].first;
}
for(int i=0;i<qu;i++){
w<<fin[i]<<"\n";
}
return 0;
}