Cod sursa(job #680098)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 14 februarie 2012 09:22:26
Problema Heavy Path Decomposition Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>
using namespace std;
long n,i,c[100002],x,y,m,t[100002];
long q;
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]){ t[p->info]=nd; dfs(p->info,nv+1); }
		p=p->adr;
	}
}
long calculeaza(int x,int y)
{long maxx=c[x];
	while(x!=y)
	{
		if(c[x]>maxx)maxx=c[x];
		if(c[y]>maxx)maxx=c[y];
		if(niv[x]>=niv[y])x=t[x]; 
		else y=t[y];
	}
	return 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);
	  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);
	int k=0;
	for(i=1;i<=m;i++)
	{
	  scanf("%ld %ld %ld",&q,&x,&y);
	  if(!q)
		  c[x]=y;
	  if(q){ k++; printf("%ld\n",calculeaza(x,y)); }
	}
return 0;}