Pagini recente » Cod sursa (job #1378748) | Cod sursa (job #1734343) | Cod sursa (job #2214333) | Cod sursa (job #500964) | Cod sursa (job #1072380)
#include<fstream>
#include<algorithm>
#include<cstring>
#define NN 90010
#define N 305
#define Q 20100
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int i,j,n,q,di,t1,t2,k,nr,m,b[N][N],t[NN],a[N][N],sol[Q];
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
struct punct{int x,y;}v[NN];
struct seg{int x1,x2,y1,y2,p;}aq[Q];
inline bool cmp(punct p1,punct p2)
{
return a[p1.x][p1.y]>a[p2.x][p2.y];
}
inline bool cmp1(seg s1,seg s2)
{
return sol[s1.p]>sol[s2.p];
}
inline void uneste(int x,int y)
{
t[y]=x;
// g<<x<<' '<<y<<'\n';
}
inline int tata(int x)
{
if(x==t[x])
return x;
return t[x]=tata(t[x]);
}
int main()
{
f>>n>>q;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
f>>a[i][j];
v[++nr].x=i;
v[nr].y=j;
}
sort(v+1,v+nr+1,cmp);
for(i=1;i<=q;++i)
{
f>>aq[i].x1>>aq[i].y1>>aq[i].x2>>aq[i].y2;
aq[i].p=i;
}
for(k=(1<<20);k;k>>=1)
{
sort(aq+1,aq+q+1,cmp1);
memset(b,0,sizeof(b));
for(i=1;i<=n*n;++i)
t[i]=i;
for(i=j=1,m=0;j<=q;++j)
{
while(i<=n*n&&sol[aq[j].p]+k<=a[v[i].x][v[i].y]){b[v[i].x][v[i].y]=++m;for(di=0;di<=3;++di)if(b[v[i].x+dx[di]][v[i].y+dy[di]])uneste(tata(b[v[i].x][v[i].y]),tata(b[v[i].x+dx[di]][v[i].y+dy[di]]));++i;}
t1=tata(b[aq[j].x1][aq[j].y1]);
t2=tata(b[aq[j].x2][aq[j].y2]);
if(t1&&t1==t2)
sol[aq[j].p]+=k;
}
}
for(i=1;i<=q;++i)
g<<sol[i]<<'\n';
return 0;
}