Cod sursa(job #432795)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 2 aprilie 2010 19:30:41
Problema Matrice 2 Scor 45
Compilator c Status done
Runda Arhiva de probleme Marime 2.35 kb
#include<stdio.h>
#define infile "matrice2.in"
#define outfile "matrice2.out"
#define nmax 313
#define qmax (23*1000)
#define cmax (1000*1013)
const int ii[]={-1,0,1,0};
const int jj[]={0,1,0,-1};
struct lista
{
	int x,y,p; //cele doua pozitii pe care le uneste, respectiv pozitia catre urmatoarea muchie cu acelasi cost
} l[(nmax*nmax)<<2]; //lista cu muchiile .... pe costuri
struct query
{
	int x,y; //valorile pentru pozitia de start repsectiv sfarsit
	int r; //raspunsul la query
} a[qmax]; //query-urile
int c[cmax]; //pozitia catre lista pentru fiecare cost
int d[nmax*nmax]; //vectorul unde tinem paduri de multimi disjuncte
int e[qmax]; //query-urile ce le mai avem de rezolvat
int m[nmax][nmax]; //valorile din matrice
int n; //dimensiunea mtricei patratice
int q; //numarul de query-uri
int nrl; //numarul de elemente din lista
int valmax; //valoarea maxima a unei muchii

inline int min(int a, int b)
{
	if(a<b) return a; return b;
}

inline int max(int a, int b)
{
	if(a>b) return a; return b;
}

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

inline void push(int nr, int x, int y, int z)
{
	valmax=max(valmax,z), l[nr].x=x, l[nr].y=y, l[nr].p=c[z], c[z]=nr;
}

int componenta(int x)
{
	int y,t=x;
	while(d[t]) t=d[t];
	while(d[x]) y=d[x],d[x]=t,x=y;
	return t;
}

void unit(int x, int y)
{
	if(componenta(x)!=componenta(y))
		d[componenta(x)]=componenta(y);
}

void read()
{
	int i,j,x1,y1,x2,y2;
	scanf("%d %d\n",&n,&q);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			scanf("%d",&m[i][j]);
	for(i=1;i<=q;i++)
	{
		scanf("%d %d %d %d\n",&x1,&y1,&x2,&y2);
		a[i].x=poz(x1,y1), a[i].y=poz(x2,y2);
	}
}

void init()
{
	int i,j,k;
	
	//initializam muchiile sortate
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			for(k=0;k<4;k++)
				if(i+ii[k]>0 && i+ii[k]<=n && j+jj[k]>0 && j+jj[k]<=n)
					push(++nrl,poz(i,j),poz(i+ii[k],j+jj[k]),min(m[i][j],m[i+ii[k]][j+jj[k]]));
	
	//initializam vectorul e
	for(i=1;i<=q;i++) e[i]=i;
}

void solve()
{
	int i,j,k;
	
	for(i=valmax,j=q;i>0&&j>0;i--)
		if(c[i])
		{
			for(k=c[i];k;k=l[k].p)
				unit(l[k].x,l[k].y);
			for(k=1;k<=j;k++)
				if(componenta(a[e[k]].x)==componenta(a[e[k]].y))
					a[e[k]].r=i,e[k--]=e[j--];
		}
}

void write()
{
	int i;
	for(i=1;i<=q;i++)
		printf("%d\n",a[i].r);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	solve();
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}