Pagini recente » Cod sursa (job #1073466) | Cod sursa (job #190541) | Cod sursa (job #1075934) | Cod sursa (job #2224245) | Cod sursa (job #680098)
Cod sursa(job #680098)
#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;}