Pagini recente » Cod sursa (job #1964147) | Cod sursa (job #381819) | Cod sursa (job #930508) | Cod sursa (job #2352374) | Cod sursa (job #680092)
Cod sursa(job #680092)
#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]){ t[p->info]=nd; dfs(p->info,nv+1); }
p=p->adr;
}
}
void calculeaza(int x,int y)
{long maxx=0;
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];
}
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);
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;}