Cod sursa(job #831339)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 8 decembrie 2012 15:00:06
Problema Matrice 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
int n,T,mat[310][310],valmax,sol[20100];
struct Pozitie{int x,y;};
vector <Pozitie> G[1000100];
struct Query{int xs,ys,xf,yf;};
Query Q[20100];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int tata[100100],h[100100];
bool viz[310][310];
vector <int> q[2];

inline int Find(int x)
{
    int r=x;
    while(tata[r])
        r=tata[r];
    int y=x,aux;
    while(y!=r)
    {
        aux=tata[y];
        tata[y]=r;
        y=aux;
    }
    return r;
}

inline void Union(int x,int y)
{
	if(h[x]>h[y])
		tata[y]=x;
	else
	{
		tata[x]=y;
		if(h[x]==h[y])
			h[y]++;
	}
}

int main()
{
	int i,j,k,x,y,A,B,p;
	Pozitie aux;
	ifstream fin("matrice2.in");
	fin>>n>>T;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			fin>>mat[i][j];
			aux.x=i;
			aux.y=j;
			G[mat[i][j]].push_back(aux);
			valmax=max(valmax,mat[i][j]);
		}
	}
	for(i=1;i<=T;i++)
	{
		fin>>Q[i].xs>>Q[i].ys>>Q[i].xf>>Q[i].yf;
		q[0].push_back(i);
	}
	fin.close();
	
	p=0;
	for(k=valmax;k>0;k--)
	{
		if(G[k].size()==0)
			continue;
		for(i=G[k].size()-1;i>=0;i--)
		{
			aux=G[k][i];
			viz[aux.x][aux.y]=true;
			for(j=0;j<4;j++)
			{
				x=aux.x+dx[j];
				y=aux.y+dy[j];
				if(x>0 && x<=n && y>0 && y<=n && viz[x][y])
				{
					A=Find(x*n+y);
					B=Find(aux.x*n+aux.y);
					if(A!=B)
						Union(A,B);
				}
			}
		}
		for(i=q[p].size()-1;i>=0;i--)
		{
			A=Find(Q[q[p][i]].xs*n+Q[q[p][i]].ys);
			B=Find(Q[q[p][i]].xf*n+Q[q[p][i]].yf);
			if(A==B)
				sol[q[p][i]]=k;
			else
				q[1-p].push_back(q[p][i]);
		}
		q[p].clear();
		p=1-p;
	}
	
	ofstream fout("matrice2.out");
	for(i=1;i<=T;i++)
		fout<<sol[i]<<"\n";
	fout.close();
	return 0;
}