Pagini recente » Cod sursa (job #2768) | Cod sursa (job #105861) | Cod sursa (job #2253387) | Statistici Popescu Stefan (StefanPopescu2) | Cod sursa (job #1162914)
#include<fstream>
#include<algorithm>
#include<vector>
#include<cstring>
#define NMAX 305
#define QMAX 20005
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int n,q,G[NMAX*NMAX],dx[]={-1,0,1,0},dy[]={0,1,0,-1},Index[NMAX][NMAX];
struct Mat
{
int i,j,val;
static bool sort_val(Mat a,Mat b)
{
return a.val>b.val;
}
}v[NMAX*NMAX];
struct Query
{
int X1,Y1,X2,Y2,ind,val;
static bool sort_val(Query a,Query b)
{
return a.val>b.val;
}
static bool sort_ind(Query a,Query b)
{
return a.ind<b.ind;
}
}sol[QMAX];
inline int Find(int nod)
{
if(nod!=G[nod])
return (G[nod]=Find(G[nod]));
return nod;
}
void Join(int i,int j)
{
int ii,jj;
G[Index[i][j]]=Index[i][j];
for(int k=0;k<4;k++)
{
ii=i+dx[k];
jj=j+dy[k];
if(G[Index[ii][jj]])
G[Find(Index[ii][jj])]=Index[i][j];
}
}
int main()
{
fin>>n>>q;
for(int i=1,k=0;i<=n;i++)
for(int j=1;j<=n;j++)
{
v[++k].i=i;
v[k].j=j;
fin>>v[k].val;
Index[i][j]=k;
}
for(int i=1;i<=q;i++)
{
fin>>sol[i].X1>>sol[i].Y1>>sol[i].X2>>sol[i].Y2;
sol[i].ind=i;
}
sort(v+1,v+n*n+1,Mat::sort_val);
for(int p=(1<<19);p;p/=2)
{
memset(G,0,sizeof G);
sort(sol+1,sol+q+1,Query::sort_val);
for(int i=1,j=1;i<=q;i++)
{
for(;sol[i].val+p<=v[j].val;j++)
Join( v[j].i,v[j].j );
int n1=Find(Index[sol[i].X1][sol[i].Y1]),n2=Find(Index[sol[i].X2][sol[i].Y2]);
if(n1==n2 && n1)
sol[i].val+=p;
}
}
sort(sol+1,sol+q+1,Query::sort_ind);
for(int i=1;i<=q;i++)
fout<<sol[i].val<<'\n';
return 0;
}