Pagini recente » Cod sursa (job #173305) | Cod sursa (job #1808501) | Cod sursa (job #2497952) | Cod sursa (job #958482) | Cod sursa (job #1162666)
#include<fstream>
#include<algorithm>
#include<set>
#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};
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];
int Find(int nod)
{
while(nod!=G[nod])
nod=G[nod];
return nod;
}
void Join(int i,int j)
{
int nod=(i-1)*n+j,ii,jj;
G[nod]=nod;
set<int> aux;
set<int>::iterator it;
aux.insert(G[nod]);
for(int k=0;k<4;k++)
{
ii=i+dx[k];
jj=j+dy[k];
if(ii>0 && jj>0 && ii<=n && jj<=n && G[ (ii-1)*n+jj ])
aux.insert(Find((ii-1)*n+jj));
}
int val=*(aux.begin());
for(it=aux.begin();it!=aux.end();++it)
G[*it]=val;
}
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;
}
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<<20);p;p/=2)
{
memset(G,0,sizeof G);
sort(sol+1,sol+q+1,Query::sort_val);
for(int i=1;i<=q;i++)
{
for(int j=1;j<=n*n && sol[i].val+p<=v[j].val;j++)
Join( v[j].i,v[j].j );
int n1=Find((sol[i].X1-1)*n+sol[i].Y1),n2=Find((sol[i].X2-1)*n+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;
}