Pagini recente » Cod sursa (job #2240019) | Cod sursa (job #2084155) | Cod sursa (job #2384176) | Cod sursa (job #2317009) | Cod sursa (job #2445133)
#include <bits/stdc++.h>
using namespace std;
int n,q,di,t1,t2,k,nr,m,b[303][303],t[90009],matrice[303][303],ans[20002];
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
struct punct
{
int x,y;
} v[90009];
struct seg
{
int x1,x2,y1,y2,p;
} query[20002];
bool cmp(punct p1,punct p2)
{
return matrice[p1.x][p1.y]>matrice[p2.x][p2.y];
}
bool cmp1(seg s1,seg s2)
{
return ans[s1.p]>ans[s2.p];
}
void uneste(int x,int y)
{
t[y]=x;
}
int tata(int x)
{
if(x==t[x])
{
return x;
}
return t[x]=tata(t[x]);
}
int main()
{
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
fin>>n>>q;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
{
fin>>matrice[i][j];
v[++nr].x=i;
v[nr].y=j;
}
}
sort(v+1,v+nr+1,cmp);
for(int i=1; i<=q; ++i)
{
fin>>query[i].x1>>query[i].y1>>query[i].x2>>query[i].y2;
query[i].p=i;
}
for(k=(1<<20); k; (k>>=1))
{
sort(query+1,query+q+1,cmp1);
memset(b,0,sizeof(b));
for(int i=1; i<=n*n; ++i)
{
t[i]=i;
}
int i,j;
for(i=j=1,m=0; j<=q; ++j)
{
while(i<=n*n && ans[query[j].p]+k<=matrice[v[i].x][v[i].y])
{
b[v[i].x][v[i].y]=++m;
for(di=0; di<4; ++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[query[j].x1][query[j].y1]);
t2=tata(b[query[j].x2][query[j].y2]);
if(t1 && t1==t2)
{
ans[query[j].p]+=k;
}
}
}
for(int i=1; i<=q; ++i)
{
fout<<ans[i]<<"\n";
}
return 0;
}