Cod sursa(job #424380)

Utilizator loginLogin Iustin Anca login Data 24 martie 2010 20:11:00
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
# include <fstream>
# include <cstdio>
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
struct nod{
	int v, c;
	nod(){}
	nod(int V, int C){
		v=V;c=C;}
	friend bool operator < (const nod &a, const nod &b){
		return a.c>b.c;
	}
};
struct quer{
	int a, b, i;
	quer(){}
	quer(int A, int B, int I){
		a=A;b=B;i=I;}
};
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;
	int A, B;
	for (int i=1;i<=q;i++)
	{
		fin>>x1>>y1>>x2>>y2;
		A=NOD(x1, y1);
		B=NOD(x2, y2);
		Q[i]=quer(A, B, i);
	}
	qq=q;
}

int inline scoate_i(int N)
{
	if (N%n==0)return N/n;
	return N/n+1;
}

int inline scoate_j(int N, int i)
{
	return N-(i-1)*n;
}

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;i++)
	{
//		cout<<Q[i].i<<" ";
		r1=rad(Q[i].a);
		r2=rad(Q[i].b);
		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(NOD(i,j),a[i][j]));
	sort(V.begin(), V.end());	
	for (vector<nod>::iterator I=V.begin();I<V.end() && !gata;++I)
	{
		i=scoate_i(I->v);
		j=scoate_j(I->v, i);
		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(I->v);
				r2=rad(NOD(ii, jj));
				if (r1!=r2)
					t[r1]=r2;
			}
		}
		if ((I+1)->c!=I->c)
			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;
}