Pagini recente » Cod sursa (job #1629988) | Cod sursa (job #1722608) | Cod sursa (job #2613454) | Cod sursa (job #1463251) | Cod sursa (job #2390255)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("matrice2.in");
ofstream g ("matrice2.out");
const int nmax=3e2+3;
const int maxx=9e4+3;
const int qmax=2e4+3;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1},n,q,L;
int v[nmax][nmax],X[maxx],Y[maxx],val[maxx],poz[maxx],gr[maxx],sol[qmax],query[qmax],poz2[qmax],a1[qmax],b1[qmax],a2[qmax],b2[qmax],k,p,usu,cx,cy;
char a[nmax][nmax];
int cmp(int x,int y)
{
return val[x]>val[y];
}
int cmp2(int x,int y)
{
return query[x]>query[y];
}
inline int GR(int x)
{
if(x!=gr[x]) gr[x]=GR(gr[x]);
return gr[x];
}
int main()
{
ios::sync_with_stdio(false);
f>>n>>q;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
++L;
v[i][j]=L;
X[L]=i;
Y[L]=j;
f>>val[L];
poz[L]=L;
}
}
for(int i=1;i<=q;++i) f>>a1[i]>>b1[i]>>a2[i]>>b2[i];
sort(poz+1,poz+L+1,cmp);
for(usu=1;usu<val[poz[1]];usu<<=1);
for(;usu;usu>>=1)
{
for(int i=1;i<=q;++i)
{
query[i]=sol[i]+usu;
poz2[i]=i;
}
sort(poz2+1,poz2+q+1,cmp2);
for(int i=1;i<=L;++i) gr[i]=i;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j) a[i][j]=0;
}
int j=1;
for(int i=1;i<=L;)
{
for(int k=j;j<=q&&query[poz2[j]]>val[poz[i]];++j) if(GR(v[a1[poz2[j]]][b1[poz2[j]]])==GR(v[a2[poz2[j]]][b2[poz2[j]]])) sol[poz2[j]]+=usu;
for(int k=i;i<=L&&val[poz[i]]==val[poz[k]];++i)
{
a[X[poz[i]]][Y[poz[i]]]=1;
for(int p=0;p<4;++p)
{
cx=X[poz[i]]+dx[p];
cy=Y[poz[i]]+dy[p];
if(cx>0&&cy>0&&cx<=n&&cy<=n&&a[cx][cy]) gr[gr[GR(v[cx][cy])]]=gr[poz[i]];
}
}
}
for(;j<=q;++j) if(GR(v[a1[poz2[j]]][b1[poz2[j]]])==GR(v[a2[poz2[j]]][b2[poz2[j]]])) sol[poz2[j]]+=usu;
}
for(int i=1;i<=q;++i) g<<sol[i]<<'\n';
return 0;
}