Pagini recente » Cod sursa (job #127223) | Cod sursa (job #299178) | Cod sursa (job #2956647) | Cod sursa (job #2715974) | Cod sursa (job #428076)
Cod sursa(job #428076)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define infile "matrice2.in"
#define outfile "matrice2.out"
#define MaxN 324
#define MaxQ 200024
int a[MaxN][MaxN];
char uz[MaxN][MaxN];
int N,Q;
int x1[MaxQ],y1[MaxQ],x2[MaxQ],y2[MaxQ];
int sol[MaxQ];
int C[MaxN*MaxN],L;
int X[MaxN*MaxN],Y[MaxN*MaxN];
int poz[MaxN*MaxN],poz2[MaxN*MaxN],Query[MaxN*MaxN],G[MaxN*MaxN];
int dx[4]={0,0,1,-1}, dy[4]={1,-1,0,0};
int cmp(int x,int y)
{
return C[x]>C[y];
}
int cmp2(int x,int y)
{
return Query[x]>Query[y];
}
int tata(int nod)
{
if(nod!=G[nod])
G[nod]=tata(G[nod]);
return G[nod];
}
void read()
{
int i,j;
scanf("%d%d",&N,&Q);
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
L++;
a[i][j]=L;
X[L]=i; Y[L]=j;
scanf("%d",&C[L]);
poz[L]=L;
}
for(i=1;i<=Q;i++)
scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);
}
void solve()
{
std::sort(poz+1,poz+L+1,cmp);
int h,i,p,j,k,xc,yc;
for(h=1;h<=C[poz[1]];h<<=1) ;
for(;h;h>>=1)
{
for(i=1;i<=Q;i++)
{
Query[i]=sol[i]+h;
poz2[i]=i;
}
std::sort(poz2+1,poz2+Q+1,cmp2);
for(i=1;i<=L;i++)
G[i]=i;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
uz[i][j]=0;
i=j=1;
while(i<=L)
{
for(k=j; j<=Q && Query[poz2[j]]>C[poz[i]];j++)
if(tata(a[x1[poz2[j]]][y1[poz2[j]]])==tata(a[x2[poz2[j]]][y2[poz2[j]]]))
sol[poz2[j]]+=h;
for(k=i;i<=L && C[poz[i]]==C[poz[k]];i++)
{
uz[X[poz[i]]][Y[poz[i]]]=1;
for(p=0;p<4;p++)
{
xc=X[poz[i]]+dx[p]; yc=Y[poz[i]]+dy[p];
if(xc>0 && yc>0 && xc<=N && yc<=N && uz[xc][yc])
G[G[tata(a[xc][yc])]]=G[poz[i]];
}
}
}
for(;j<=Q;j++)
if(tata(a[x1[poz2[j]]][y1[poz2[j]]])==tata(a[x2[poz2[j]]][y2[poz2[j]]]))
sol[poz2[j]]+=h;
}
}
void write()
{
int i;
for(i=1;i<=Q;i++)
printf("%d\n",sol[i]);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}