Pagini recente » Cod sursa (job #2565580) | Cod sursa (job #1571783) | Cod sursa (job #3257829) | Cod sursa (job #809895) | Cod sursa (job #2628184)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");
int num[305][305];
pair<int,int> inv[90005];
int val[90005],v[90005];
int link[90005],dim[90005];
pair<int,int> intra[90005];
int tata(int x)
{
int cpy=x,aux;
while(x!=link[x]) x=link[x];
while(cpy!=link[cpy]) aux=cpy,cpy=link[cpy],link[aux]=x;
return x;
}
void unite(int x,int y,int pas)
{
x=tata(x);
y=tata(y);
if(x==y) return;
if(dim[x]<dim[y]) swap(x,y);
intra[y]={x,pas};
dim[x]+=dim[y];
link[y]=x;
}
bool mycmp(int a,int b)
{
return val[a]>val[b];
}
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int n,q,x,y,xx,yy,cnt=0;
void dsu()
{
for(int i=1;i<=cnt;++i)
{
link[v[i]]=v[i];
dim[v[i]]=1;
int x=inv[v[i]].first;
int y=inv[v[i]].second;
for(int d=0;d<4;++d)
{
int xx=x+dx[d];
int yy=y+dy[d];
if(1<=xx and xx<=n and 1<=yy and yy<=n and link[num[xx][yy]])
unite(v[i],num[xx][yy],val[v[i]]);
}
}
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
++cnt;
cin>>val[cnt];
num[i][j]=cnt;
inv[cnt]={i,j};
v[cnt]=cnt;
}
sort(v+1,v+cnt+1,mycmp);
dsu();
for(int i=1;i<=q;++i)
{
cin>>x>>y>>xx>>yy;
int a=num[x][y],b=num[xx][yy];
while(intra[a].first!=b and intra[b].first!=a)
{
if(intra[a].second>intra[b].second)
a=intra[a].first;
else b=intra[b].first;
}
if(intra[a].first==b) cout<<intra[a].second<<'\n';
else cout<<intra[b].second<<'\n';
}
return 0;
}