Pagini recente » Cod sursa (job #1687103) | Cod sursa (job #2404201) | Cod sursa (job #1585674) | Cod sursa (job #811971) | Cod sursa (job #1964422)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
const int Nmax=310;
const int Qmax=20010;
int lin[4]={1,-1,0,0};
int col[4]={0,0,1,-1};
int POZ[Nmax][Nmax];
int val[Nmax*Nmax],X[Nmax*Nmax],Y[Nmax*Nmax],P[Nmax*Nmax];
int tata[Nmax*Nmax];
int Query[Qmax],P2[Qmax],sol[Qmax];
int X1[Qmax],Y1[Qmax],X2[Qmax],Y2[Qmax];
bool B[Nmax][Nmax];
bool cmp(int a,int b)
{
return val[a]>val[b];
}
bool cmp2(int a,int b)
{
return Query[a]>Query[b];
}
int cauta_tata(int x)
{
if(x!=tata[x]) tata[x]=cauta_tata(tata[x]);
return tata[x];
}
int main()
{
int n,q,i,j,k,poz=0,p,step,cx,cy;
fin>>n>>q;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
poz++;
POZ[i][j]=poz;
X[poz]=i;
Y[poz]=j;
fin>>val[poz];
P[poz]=poz;
}
}
for(i=1;i<=q;i++) fin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i];
sort(P+1,P+1+poz,cmp);
for(step=1;step<val[P[1]];step<<=1);
for( ; step ; step>>=1)
{
for(i=1;i<=q;i++)
{
Query[i]=sol[i]+step;
P2[i]=i;
}
sort(P2+1,P2+1+q,cmp2);
for(i=1;i<=poz;i++)
{
tata[i]=i;
B[X[i]][Y[i]]=0;
}
for(j=1,i=1;i<=poz;)
{
for(; j<=q && Query[P2[j]]>val[P[i]];j++)
{
if(cauta_tata(POZ[X1[P2[j]]][Y1[P2[j]]])==cauta_tata(POZ[X2[P2[j]]][Y2[P2[j]]]) ) sol[P2[j]]+=step;
}
for(k=i ; i<=poz && val[P[i]]==val[P[k]];i++)
{
B[X[P[i]]][Y[P[i]]]=1;
for(p=0;p<4;p++)
{
cx= X[P[i]]+lin[p];
cy= Y[P[i]]+col[p];
if(cx>0 && cy>0 && cx<=n && cy<=n && B[cx][cy]) tata[ tata[cauta_tata(POZ[cx][cy])] ]= tata[P[i]];
}
}
}
for(;j<=q;j++)
{
if(cauta_tata(POZ[X1[P2[j]]][Y1[P2[j]]])==cauta_tata(POZ[X2[P2[j]]][Y2[P2[j]]]) ) sol[P2[j]]+=step;
}
}
for(i=1;i<=q;i++) fout<<sol[i]<<"\n";
}