Pagini recente » Cod sursa (job #2445934) | Cod sursa (job #983649) | Cod sursa (job #2145929) | Cod sursa (job #2587893) | Cod sursa (job #3217827)
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 309
#define QMAX 20009
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int n,q;
int a[NMAX][NMAX];
int lg;
pair <int,int> v[NMAX*NMAX];
int ans[QMAX];
int dsu[NMAX*NMAX];
int finddsu(int x);
bool comp(pair <int,int> x, pair <int,int> y)
{
return a[x.first][x.second]>a[y.first][y.second];
}
struct query{int x1,y1,x2,y2,ans,poz;};
query Q[QMAX];
bool compq(query x, query y)
{
return x.ans>y.ans;
}
int main()
{
fin>>n>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
fin>>a[i][j];
v[++lg]={i,j};
}
for(int i=1;i<=q;i++)
{
int x1,y1,x2,y2;
fin>>x1>>y1>>x2>>y2;
Q[i]={x1,y1,x2,y2,0,i};
}
sort(v+1,v+1+lg,comp);
for(int step=(1<<20);step;step>>=1)
{
sort(Q+1,Q+1+q,compq);
int m=1;
for(int i=1;i<=lg;i++)
dsu[i]=i;
for(int i=1;i<=q;i++)
{
for(;m<=lg && Q[i].ans+step<=a[v[m].first][v[m].second];m++)
{
int poz=(v[m].first-1)*n+v[m].second;
int up=poz-n, down=poz+n, left=poz-1, right=poz+1;
int dm=finddsu(poz);
if(up>=1 && a[v[m].first-1][v[m].second]>=Q[i].ans+step)
dsu[finddsu(up)]=dm;
if(down<=lg && a[v[m].first+1][v[m].second]>=Q[i].ans+step)
dsu[finddsu(down)]=dm;
if((poz-1)%n && a[v[m].first][v[m].second-1]>=Q[i].ans+step)
dsu[finddsu(left)]=dm;
if(poz%n && a[v[m].first][v[m].second+1]>=Q[i].ans+step)
dsu[finddsu(right)]=dm;
}
if(finddsu((Q[i].x1-1)*n+Q[i].y1)==finddsu((Q[i].x2-1)*n+Q[i].y2))
{
ans[Q[i].poz]+=step;
Q[i].ans+=step;
}
}
}
for(int i=1;i<=q;i++)
{
fout<<ans[i]<<'\n';
}
return 0;
}
int finddsu(int x)
{
while(dsu[x]!=x)
x=dsu[x];
return x;
}