Cod sursa(job #424413)

Utilizator loginLogin Iustin Anca login Data 24 martie 2010 20:39:29
Problema Matrice 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
# include <fstream>
# include <cstdio>
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
struct nod{
	int i, j, c;
	nod(){}
	nod(int I, int J, int C){
		i=I;j=J;c=C;}
	friend bool operator < (const nod &a, const nod &b){
		return a.c>b.c;
	}
};
struct quer{
	int i, j, ii, jj, I;
	quer(){}
	quer(int I, int J, int II, int JJ, int Ii){
		i=I;j=J;ii=II;jj=JJ;I=Ii;}
};
int a[303][303], t[100000], q, gata, vq[20003], n, qq;
int di[4]={0, 0, 1, -1}, dj[4]={-1, 1, 0, 0};
vector<nod> V;
quer Q[20003];

int inline NOD (int x, int y)
{
	return (x-1)*n+y;
}

void read ()
{
	ifstream fin ("matrice2.in");
	fin>>n>>q;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			fin>>a[i][j];
	int x1, x2, y1, y2;
	for (int i=1;i<=q;i++)
	{
		fin>>x1>>y1>>x2>>y2;
		Q[i].i=x1;
		Q[i].j=y1;
		Q[i].ii=x2;
		Q[i].jj=y2;
		Q[i].I=i;
	}
	qq=q;
}
int in_m (int i, int j)
{
	if (i && j && i<=n && j<=n)return 1;
	return 0;
}

int rad (int k)
{
	int y=k, i;
	while (t[k])k=t[k];
	while (t[y])
	{
		i=y;
		y=t[y];
		t[i]=k;
	}
	return k;
}	

void vezi_ce_poti(int c)
{
	int r1, r2;
	for (int i=1;i<=q;)
	{
//		cout<<Q[i].i<<" ";
		r1=rad(NOD(Q[i].i, Q[i].j));
		r2=rad(NOD(Q[i].ii, Q[i].jj));
		if (r1==r2)
		{
//			cout<<"i="<<Q[i].i<<"a="<<Q[i].a<<"b="<<Q[i].b<<" c="<<c<<endl;
			vq[Q[i].I]=c;
			Q[i]=Q[q];
			q--;
		}
		else
			++i;
		if(q==0)
			gata=1;//, cout<<"gata";
//		for(II=Q.begin();II<Q.end();++II)
//			cout<<II->i<<" ";
//		cout<<endl;
	}
//	cout<<endl;
}

void solve ()
{
	int i, j, ii, jj, r1, r2;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			V.push_back(nod(i,j,a[i][j]));
	sort(V.begin(), V.end());	
	for (vector<nod>::iterator I=V.begin();I<V.end() && !gata;++I)
	{
		i=I->i;
		j=I->j;
		for (int k=0;k<4;++k)
		{
			ii=i+di[k];
			jj=j+dj[k];
			if (in_m(ii, jj) && a[ii][jj]>=a[i][j])
			{
				r1=rad(NOD(i, j));
				r2=rad(NOD(ii, jj));
				if (r1!=r2)
					t[r1]=r2;
			}
		}
		if (!((I+1)<V.end()) || (I+1)->c!=I->c)
		{
	//		cout<<"#"<<(I+1)->c<<" "<<I->c<<endl;
			vezi_ce_poti(I->c);
		}
	}
}

void write ()
{
	freopen("matrice2.out", "w", stdout);
	for(int i=1;i<=qq;++i)
		printf("%d\n", vq[i]);
}

int main ()
{
	read ();
	solve ();
	write ();
	return 0;
}