Pagini recente » Cod sursa (job #1905756) | Cod sursa (job #2459468) | Cod sursa (job #3272454) | Cod sursa (job #2459472) | Cod sursa (job #2770592)
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
FILE*in=fopen("matrice2.in","r");
FILE*out=fopen("matrice2.out","w");
int n,q,i,j;
int mat[305][305];
int uni[305][305];
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
struct str
{
int x1,y1,x2,y2;
};
struct pct
{
int x,y,val;
};
bool sor(pct f,pct g)
{
return f.val>g.val;
}
pct p[110005];
int dad[110005],grad[110005],v[20005];
int fd(int a)
{
if(dad[a]==0)
{
return a;
}
int ans=fd(dad[a]);
dad[a]=ans;
return ans;
}
void con(int a,int b)
{
if(grad[fd(a)]==grad[fd(b)])
{
dad[fd(a)]=fd(b);
grad[fd(b)]++;
}
else if(grad[fd(a)]<grad[fd(b)])
{
dad[fd(a)]=fd(b);
}
else
{
dad[fd(b)]=fd(a);
}
}
void add(int a,int b)
{
for(int k=a;k<=b;k++)
{
uni[p[k].x][p[k].y]=k;
if(p[k].val==0)
{
return;
}
for(int h=0;h<=3;h++)
{
int px=p[k].x+dx[h];
int py=p[k].y+dy[h];
if(uni[px][py]!=0)
{
if(fd(uni[px][py])!=fd(k))
{
con(uni[px][py],k);
}
}
}
}
}
str qe[20005];
vector<int> buc[400008];
int main()
{
fscanf(in,"%d%d",&n,&q);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
fscanf(in,"%d",&mat[i][j]);
p[(i-1)*n+j].val=mat[i][j];
p[(i-1)*n+j].x=i;
p[(i-1)*n+j].y=j;
}
}
int y=n*n;
int po=1;
while(y!=0)
{
po*=2;
y/=2;
}
sort(p+1,p+n*n+1,sor);
for(i=1;i<=q;i++)
{
fscanf(in,"%d %d %d %d",&qe[i].x1,&qe[i].y1,&qe[i].x2,&qe[i].y2);
buc[1].push_back(i);
}
int bk=1;
for(int step=po;step>1;step/=2)
{
for(int pas=step/2;pas<po;pas+=step)
{
int ant=1;
memset(dad,0,sizeof(dad));
memset(uni,0,sizeof(uni));
memset(grad,0,sizeof(grad));
for(int it=0;it<buc[bk].size();it++)
{
add(ant,pas);
ant=pas+1;
if(p[pas].val==0)
{
buc[2*bk].push_back(buc[bk][it]);
}
else if(uni[qe[buc[bk][it]].x1][qe[buc[bk][it]].y1]!=0&&uni[qe[buc[bk][it]].x2][qe[buc[bk][it]].y2]!=0&&fd(uni[qe[buc[bk][it]].x1][qe[buc[bk][it]].y1])==fd(uni[qe[buc[bk][it]].x2][qe[buc[bk][it]].y2]))
{
buc[2*bk].push_back(buc[bk][it]);
}
else
{
buc[2*bk+1].push_back(buc[bk][it]);
}
}
bk++;
}
}
for(i=bk;i<bk*2;i++)
{
for(int it=0;it<buc[i].size();it++)
{
v[buc[i][it]]=p[i-bk+1].val;
}
}
for(i=1;i<=q;i++)
{
fprintf(out,"%d\n",v[i]);
}
}