Cod sursa(job #2381709)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 17 martie 2019 12:37:02
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#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;
}