Pagini recente » Monitorul de evaluare | Cod sursa (job #2158051) | Cod sursa (job #2034279) | Monitorul de evaluare | Cod sursa (job #2125440)
#include<fstream>
#include<vector>
#include<algorithm>
#define DN 305
#define DQ 20005
#define DM 1000005
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int n,q,a[DN][DN],pr[DN*DN],l,c,lnou,cnou,l1,c1,l2,c2,f,ma,t,p1,p2,rez[DQ];
int dl[4]={0,0,1,-1};
int dc[4]={1,-1,0,0};
pair<pair<int,int>,pair<int,int> >r[DQ];
vector<pair<int,int> >v[DM];
int inside(int l,int c)
{
if(l>=1&&l<=n)
if(c>=1&&c<=n)
return 1;
return 0;
}
int getpr(int nod)
{
if(pr[nod]==nod)
return pr[nod];
pr[nod]=getpr(pr[nod]);
return pr[nod];
}
int main()
{
fin>>n>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
fin>>a[i][j];
ma=max(ma,a[i][j]);
v[a[i][j]].pb({i,j});
}
for(int i=1;i<=q;i++)
{
fin>>l1>>c1>>l2>>c2;
r[i].x.y=i;
r[i].y.x=(l1-1)*n+c1;
r[i].y.y=(l2-1)*n+c2;
}
for(int h=20;h>=0;h--)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
pr[(i-1)*n+j]=(i-1)*n+j;
f=ma;
sort(r+1,r+q+1);
for(int i=q;i>=1;i--)
{
t=r[i].x.x+(1<<h);
for(int j=f;j>=t;j--)
for(auto z:v[j])
{
l=z.x;
c=z.y;
for(int d=0;d<4;d++)
{
lnou=l+dl[d];
cnou=c+dc[d];
if(inside(lnou,cnou))
if(j<=a[lnou][cnou])
{
p1=getpr(n*(lnou-1)+cnou);
p2=getpr(n*(l-1)+c);
if(p1!=p2)
pr[p1]=p2;
}
}
}
p1=getpr(r[i].y.x);
p2=getpr(r[i].y.y);
if(p1==p2)
r[i].x.x=t;
f=t-1;
}
}
for(int i=1;i<=q;i++)
rez[r[i].x.y]=r[i].x.x;
for(int i=1;i<=q;i++)
fout<<rez[i]<<'\n';
}