Cod sursa(job #7291)

Utilizator MariusMarius Stroe Marius Data 21 ianuarie 2007 13:20:53
Problema Radiatie Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.2 kb
#include <cstdio>
using namespace std;

const char iname[] = "radiatie.in";
const char oname[] = "radiatie.out";

#define MAX_N 15001
#define MAX_M 30001
#define LG 20

int N,M,K;

int m[MAX_M][3];

int id[MAX_M];

int q[MAX_M][2];

int poz[MAX_N], val[MAX_N][LG], grup[MAX_N][LG];

int Numara[MAX_N], Primul[MAX_N], Ultimul[MAX_N], GRUP[MAX_N], LINK[MAX_N];

int X[MAX_M];

void read_in()
{
	freopen(iname, "r", stdin);
	int i;
	
	scanf("%d %d %d",&N,&M,&K);
	for (i = 1; i <= M; i++)
		scanf("%d %d %d", &m[i][0], &m[i][1], &m[i][2]);
	for (i = 1; i <= K; i++)
		scanf("%d %d", &q[i][0], &q[i][1]);
}

void sort(int lo, int hi)
{
	int i, j, k;
	int mid = (hi + lo) / 2;
	
	if (lo >= hi) 
		return;
	sort(lo, mid);
	sort(mid + 1, hi);
	for(i = k = lo, j = mid + 1; i <= mid && j <= hi; k++)
		if (m[id[i]][2] < m[id[j]][2])
			X[k] = id[i ++];
		else
			X[k] = id[j ++];
	for (; i <= mid; i++, k++) X[k] = id[i];
	for (; j <= hi; j++, k++) X[k] = id[j];

	for (i = lo; i <= hi; i++)
		id[i] = X[i];
}

void connect(int x, int y, int v)
{
	int p, grX, grY, aux;
	grX = GRUP[x];
	grY = GRUP[y];
	if (grX == grY) 
		return;
	
	if (Numara[grX] > Numara[grY])
		aux = grX, grX = grY, grY = aux;
	
	for (p = Primul[grX]; p; p = LINK[p]) {
		 GRUP[p] = grY;
		 poz[p]++;
		 val[p][ poz[p] ] = v;
		 grup[p][ poz[p] ] = grY;
	}
	Numara[grY] += Numara[grX];
	Numara[grX] = 0;
	LINK[ Ultimul[grY] ] = Primul[grX];
	Ultimul[grY] = Ultimul[grX];
}

void solve()
{
	int i;
	for (i = 1; i <= M; i++)
		id[i] = i;
	sort(1, M);

	for (i = 1; i <= N; i++) {
		GRUP[i] = Primul[i] = Ultimul[i] = i;
		LINK[i] = 0;
		Numara[i] = 1;
		poz[i] = 1; 
		val[i][1] = 0; 
		grup[i][1] = i;
	}
	for (i = 1; i <= M; i++)
		connect(m[id[i]][0], m[id[i]][1], m[id[i]][2]);
}

int query(int x, int y) 
{
	int max, i, j;
	
	for (i = poz[x], j = poz[y]; grup[x][i] == grup[y][j]; i--, j--)
		;
	i++; 
	j++;
	max = val[x][i];
	if (val[y][j] > max) 
		max = val[y][j];
	return max;
}

int main()
{
	read_in();
	solve();
	/* raspunde la intrebari */
	freopen(oname, "w", stdout);
	for(int i = 1; i <= K; i++)
		printf("%d\n", query(q[i][0], q[i][1]));
	return 0;
}