Cod sursa(job #680091)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 14 februarie 2012 08:40:15
Problema Heavy Path Decomposition Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
using namespace std;
long n,i,c[100002],x,y,m,t[100002];
int op;
struct nod{int info; nod*adr;} *v[100001],*p;
int niv[100002];
char viz[100004];
void dfs(int nd,int nv)
{
	nod*p=v[nd];
	niv[nd]=nv;
	viz[nd]='1';
	while(p)
	{
		if(!viz[p->info])dfs(p->info,nv+1);
		p=p->adr;
	}
}
void calculeaza(int x,int y)
{long maxx=0;
	while(x!=y)
	{
		if(niv[x]>niv[y]){ if(c[x]>maxx)maxx=c[x]; x=t[x]; }
		else { if(c[y]>maxx)maxx=c[y]; y=t[y]; } 
	}
	printf("%ld\n",maxx);
}
int main()
{
	freopen("heavypath.in","r",stdin);freopen("heavypath.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%ld",&c[i]);
	for(i=1;i<=n-1;i++)
	{
	  scanf("%ld %ld",&x,&y);
	  t[y]=x;
	  p=new nod;
	  p->info=y; p->adr=v[x]; v[x]=p;
	  p=new nod;
	  p->info=x; p->adr=v[y]; v[y]=p;
	}
	dfs(1,1);
	for(i=1;i<=m;i++)
	{
	  scanf("%d %ld %ld",&op,&x,&y);
	  if(op==0)c[x]=y;
	    else
	  calculeaza(x,y);
	}
return 0;}