Pagini recente » Cod sursa (job #2575161) | Cod sursa (job #875166) | Cod sursa (job #1352015) | Cod sursa (job #559973) | Cod sursa (job #719332)
Cod sursa(job #719332)
#include <fstream>
#include <algorithm>
#define MAXN 310
#define VMAX 1000000
using namespace std;
const int dx[5]={0,0,1,-1};
const int dy[5]={1,-1,0,0};
typedef struct{
int x,y,v;
}mat;
mat a[MAXN*MAXN];
int poz[MAXN][MAXN],val[MAXN][MAXN],el1,el2,l,r,h,q,d,x1,x2,yf,y2,m,n,t[MAXN*MAXN];
int grupa(int i)
{
if(t[i]==i) return i;
t[i]=grupa(t[i]);
return t[i];
}
void reunite(int i,int j)
{
int up=grupa(i);
t[up]=grupa(j);
}
bool cmp(mat x,mat y)
{
return x.v>y.v;
}
bool valid(int x,int y)
{
return (x<=m and x>0 and y<=m and y>0 and val[x][y]>=h);
}
int main()
{
int i,j;
ifstream fi("matrice2.in");
ofstream fo("matrice2.out");
fi>>n>>q;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
fi>>a[(i-1)*n+j].v;
a[(i-1)*n+j].x=i;
a[(i-1)*n+j].y=j;
}
m=n*n;
sort(a+1,a+m+1,cmp);
for(i=1;i<=m;i++) { poz[a[i].x][a[i].y]=i; val[a[i].x][a[i].y]=a[i].v; }
while(q--)
{
fi>>x1>>yf>>x2>>y2;
el1=poz[x1][yf]; el2=poz[x2][y2];
l=1; r=VMAX;
while(l<r)
{
if(h==(l+r)/2) break;
h=(l+r)/2;
for(i=1;i<=m;i++) t[i]=i;
for(i=1;i<=m and a[i].v>=h;i++)
{
for(d=0;d<4;d++)
if(grupa(i)!=grupa(poz[a[i].x+dx[d]][a[i].y+dy[d]]) and valid(a[i].x+dx[d],a[i].y+dy[d])) reunite(i,poz[a[i].x+dx[d]][a[i].y+dy[d]]);
}
if(grupa(el1)==grupa(el2)) l=h; else r=h+1;
}
fo<<l<<"\n";
}
return 0;
}