Pagini recente » Cod sursa (job #368167) | Cod sursa (job #1440610) | Cod sursa (job #2352383) | Cod sursa (job #1225011) | Cod sursa (job #2920813)
#include <bits/stdc++.h>
#define nmax 90003
#define mmax 200003
#define imax 0x3f3f3f3f
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int v[nmax],c[mmax],s[mmax];
bool u[mmax];
int n,n2,q;
int par[nmax],h[nmax];
int st[nmax],k;
int tata(int nod)
{
k=0;
while(par[nod]!=nod)
{
st[k++]=nod;
nod=par[nod];
}
for(int i=0;i<k;i++)
{
par[st[i]]=nod;
}
return nod;
}
bool merg(int a, int b)
{
a=tata(a);
b=tata(b);
if(a==b) return 0;
if(h[a]>h[b]) swap(a,b);
h[b]+=h[a];
par[a]=b;
return 1;
}
bool cmp(const int &a, const int &b)
{
return c[a]>c[b];
}
void pad()
{
sort(s,s+n2*2,cmp);
for(int i=0;i<n2;i++) par[i]=i;
for(int i=0;i<n2*2;i++)
{
int a,b,c=s[i];
if(c>=n2)
{
a=c-n2;
b=c-n2-n;
}
else
{
a=c;
b=c-1;
}
if(a>=0&&b>=0&&merg(a,b))
{
u[c]=1;
}
}
}
bool vis[nmax];
int qst,qdr;
int dfs(int nod) //i hate this, dont mind it
{
if(nod==qdr) return v[nod];
vis[nod]=1;
int ans;
if(nod+n<n2&&u[nod+n2+n]&&!vis[nod+n])
{
ans=dfs(nod+n);
if(ans>0) return min(v[nod],ans);
}
if(nod-n>=0&&u[nod+n2]&&!vis[nod-n])
{
ans=dfs(nod-n);
if(ans>0) return min(v[nod],ans);
}
if(nod+1<n2&&u[nod+1]&&!vis[nod+1])
{
ans=dfs(nod+1);
if(ans>0) return min(v[nod],ans);
}
if(nod-1>=0&&u[nod]&&!vis[nod-1])
{
ans=dfs(nod-1);
if(ans>0) return min(v[nod],ans);
}
return 0;
}
int main()
{
f>>n>>q;
n2=n*n;
for(int i=0;i<n2;i++)
{
f>>v[i];
}
for(int i=0;i<n2;i++)
{
if(i%n!=0)c[i]=min(v[i],v[i-1]);
else c[i]=-imax;
if(i-n>=0) c[i+n2]=min(v[i],v[i-n]);
else c[i+n2]=-imax;
s[i]=i;
s[i+n2]=i+n2;
}
pad();
int a,b,c,d;
for(int i=0;i<q;i++)
{
f>>a>>b>>c>>d;
a--;b--;c--;d--;
qst=a*n+b;
qdr=c*n+d;
for(int i=0;i<n2;i++) vis[i]=0;
g<<dfs(qst)<<'\n';
}
return 0;
}