Cod sursa(job #180972)

Utilizator razvi9Jurca Razvan razvi9 Data 17 aprilie 2008 18:39:28
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include<cstdio>
#include<cstdlib>
#include<vector>
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define mp std::make_pair<int,int>
int n,m,k,i,r[100001],t[15001];
struct muchie{int x,y,c;};
muchie a[30001];
std::vector<std::pair<int,int>> b[15001];
int cmp(const void *a,const void *b)
{
	muchie x,y;
	x=*(muchie *)a; 
	y=*(muchie *)b;
	return x.c-y.c;
}
inline int rad(int x)
{
	if(x==t[x]) return x;
	t[x]=rad(t[x]);
	return t[x];
}
inline int uneste(int x,int y)
{
	if(rad(x)!=rad(y))
	{
		if(r[t[x]]==r[t[y]])
			r[t[x]]++,t[t[y]]=t[x];
		else
			if(r[t[x]]>r[t[y]])
				t[t[y]]=t[x];
			else
				t[t[x]]=t[y];
		return 1;
	}
	return 0;
}
inline void kruskal()
{
	int left=n-1,i;
	for(i=1;i<=n;i++)
		t[i]=i,r[i]=0;
	i=1;
	while(left)
	{
		if(uneste(a[i].x,a[i].y))
		{
			b[a[i].x].push_back(mp(a[i].y,a[i].c));
			b[a[i].y].push_back(mp(a[i].x,a[i].c));
			left--;
		}
		i++;
	}
}
int e[100001],ai[100001],nr;
void euler(int vf,int c,int niv)
{
	e[++nr]=vf;
	t[vf]=nr;
	for(int i=0;i<b[vf].size();i++)
		if(!t[b[vf][i].first])
		{
			r[nr]=b[vf][i].second;
			euler(b[vf][i].first,c+b[vf][i].second,niv+1);
			r[nr]=b[vf][i].second;
			e[++nr]=vf;
		}
}
void buildcost(int poz,int st,int dr)
{
	if(st==dr)
	{
		ai[poz]=0;
		return;
	}
	int m=(st+dr)>>1,p=poz<<1;
	buildlca(p,st,m);
	buildlca(p+1,m+1,dr);
	ai[poz]=max(ai[p],max(ai[p+1],r[m]));
}
int cost(int poz,int st,int dr,int x,int y)
{
	if(x<=st && dr<=y) return ai[poz];
	int m=(st+dr)>>1,p=poz<<1;
	if(x<=m)
	{
		int a,b;
		a=cost(p,st,m,x,y);
		if(y>m)
		{
			b=cost(p+1,m+1,dr,x,y);
			return max(a,max(r[m],b));
		}
		return a;
	}
	else
		return cost(p+1,m+1,dr,x,y);
}
int Cost(int x,int y)
{
	return cost(1,1,nr,min(t[x],t[y]),max(t[x],t[y]));
}
int main()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	scanf("%d %d %d",&n,&m,&k);
	for(i=1;i<=m;i++)
		scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].c);
	qsort(a+1,m,sizeof(muchie),cmp);
	kruskal();
	memset(t,0,sizeof(t));
	euler(1,0,1);
	buildcost(1,1,nr);
	int x,y;
	for(i=1;i<=k;i++)
	{
		scanf("%d %d",&x,&y);
		printf("%d\n",Cost(x,y));
	}
	fclose(stdout);
	return 0;
}