Pagini recente » Cod sursa (job #831838) | Cod sursa (job #584563) | Cod sursa (job #762247) | Cod sursa (job #2836958) | Cod sursa (job #2073842)
#include <fstream>
#include <algorithm>
#include <cstring>
#define DN 301
#define DQ 20001
using namespace std;
struct QUERY
{
int x1,y1,x2,y2,val,ind;
bool operator<(const QUERY &other) const
{
return val>other.val;
}
};
struct EL
{
int x,y,val;
bool operator<(const EL &other) const
{
return val>other.val;
}
void make(int i,int j,int v)
{
x=i,y=j,val=v;
}
};
ifstream fi("matrice2.in");
ofstream fo("matrice2.out");
int n,nrq;
QUERY Q[DQ];
int A[DN][DN];
int P[DN*DN];
EL M[DN*DN];
int U[DN][DN];
int R[DQ];
int radacina(int a)
{
if(P[a]==0)
return a;
return P[a]=radacina(P[a]);
}
void reuniune(int a,int b)
{
if(radacina(a)!=radacina(b))
P[radacina(a)]=radacina(b);
}
int ins(int l,int c)
{
return 1<=l&&l<=n&&1<=c&&c<=n;
}
int dl[]={-1,0,1,0},dc[]={0,1,0,-1};
void baga(int ind,int val)
{
int l=M[ind].x,c=M[ind].y;
for(int d=0;d<4;d++)
{
int ln=l+dl[d],cn=c+dc[d];
if(ins(ln,cn)&&A[ln][cn]>=val)
reuniune(U[ln][cn],ind);
}
}
int main()
{
fi>>n>>nrq;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
fi>>A[i][j];
M[i*(n-1)+j].make(i,j,A[i][j]);
}
sort(M+1,M+n*n+1);
for(int i=1;i<=n*n;i++)
U[M[i].x][M[i].y]=i;
for(int i=1;i<=nrq;i++)
{
fi>>Q[i].x1>>Q[i].y1>>Q[i].x2>>Q[i].y2;
Q[i].ind=i;
}
for(int p=(1<<20);p>0;p>>=1)
{
memset(P,0,sizeof(P));
sort(Q+1,Q+nrq+1);
int ind=1;
for(int i=1;i<=nrq;i++)
{
int cat=Q[i].val+p;
while(M[ind].val>=cat&&ind<=n*n)
{
baga(ind,cat);
ind++;
}
if(radacina(U[Q[i].x1][Q[i].y1])==radacina(U[Q[i].x2][Q[i].y2]))
Q[i].val+=p;
}
}
for(int i=1;i<=nrq;i++)
R[Q[i].ind]=Q[i].val;
for(int i=1;i<=nrq;i++)
fo<<R[i]<<"\n";
fi.close();
fo.close();
return 0;
}