Pagini recente » Cod sursa (job #2375369) | Cod sursa (job #1815194) | Cod sursa (job #914297) | Cod sursa (job #756905) | Cod sursa (job #2763128)
#include <iostream>
#include <fstream>
#include <algorithm>
#define MaxN 301
#define MaxEl 90001
#define MaxQ 20001
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int n,q,L,step,i,j,k;
int P[MaxEl],C[MaxEl],W[MaxN][MaxN];
int X[MaxEl],Y[MaxEl];
int Query[MaxQ],P2[MaxQ],X1[MaxQ],X2[MaxQ],Y1[MaxQ],Y2[MaxQ];
int Tata[MaxEl],Sol[MaxQ];
int dirx[]={-1,+0,+1,+0};
int diry[]={+0,-1,+0,+1};
bool viz[MaxN][MaxN];
bool cmp(int x,int y)
{
return C[x]>C[y];
}
bool cmp2(int x,int y)
{
return Query[x]>Query[y];
}
int rad(int x)
{
if(Tata[x]!=x)return rad(Tata[x]);
return x;
}
int main()
{
fin>>n>>q;;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
X[++L]=i;
Y[L]=j;
fin>>C[L];
P[L]=L;
W[i][j]=L;
}
}
for(int i=1;i<=q;++i)
fin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i];
sort(P+1,P+L+1,cmp);
for(step=1;step<C[P[1]];step<<=1);
for(;step;step>>=1)
{
for(int i=1;i<=q;++i)
{
Query[i]=Sol[i]+step;
P2[i]=i;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
viz[i][j]=0;
for(int i=1;i<=L;++i)
Tata[i]=i;
sort(P2+1,P2+q+1,cmp2);
for(i=1,j=1;i<=L;)
{
for(;j<=q&&Query[P2[j]]>C[P[i]];++j)//query-urile cu valori mai mare decat C[P[i]]
if(rad(W[X1[P2[j]]][Y1[P2[j]]])==rad(W[X2[P2[j]]][Y2[P2[j]]]))Sol[P2[j]]+=step;
for(k=i;i<=L&&C[P[i]]==C[P[k]];++i)//marchez toate elementele egale cu C[P[i]]
{
viz[X[P[i]]][Y[P[i]]]=1;
for(int dir=0;dir<4;++dir)
{
int cx=X[P[i]]+dirx[dir];
int cy=Y[P[i]]+diry[dir];
if(cx>=1&&cx<=n&&cy>=1&&cy<=n&&viz[cx][cy])
Tata[rad(W[cx][cy])]=P[i];
}
}
}
for(;j<=q;++j)
Sol[P2[j]]+=step;
}
for(int i=1;i<=q;++i)fout<<Sol[i]<<'\n';
return 0;
}