Pagini recente » Cod sursa (job #2521656) | Cod sursa (job #1012487) | Cod sursa (job #2186509) | Cod sursa (job #197731) | Cod sursa (job #1937630)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
const int Nmax=100001;
int val[Nmax],tata[Nmax],depth[Nmax];
vector<int>H[Nmax];
bitset<Nmax>viz;
void dfs(int nod,int dept,int fath)
{
viz[nod]=1;
depth[nod]=dept;
tata[nod]=fath;
for(unsigned i=0;i<H[nod].size();i++)
{
if(viz[H[nod][i]]==0) dfs(H[nod][i],dept+1,nod);
}
}
int main()
{
int n,m,i,a,b,maxi,t,x,y;
fin>>n>>m;
for(i=1;i<=n;i++) fin>>val[i];
for(i=1;i<n;i++)
{
fin>>x>>y;
H[x].push_back(y);
H[y].push_back(x);
}
dfs(1,0,0);
depth[1]=n+1;
for(i=1;i<=m;i++)
{
fin>>t>>x>>y;
if(t==0) val[x]=y;
else
{
a=x;b=y;maxi=-1;
while(1)
{
maxi=max(maxi,val[a]);
maxi=max(maxi,val[b]);
if(a==b) break;
if(depth[a]<depth[b] || b==1) a=tata[a];
else if(depth[a]>depth[b] || a==1) b=tata[b];
else
{
a=tata[a];
b=tata[b];
}
}
fout<<maxi<<"\n";
}
}
}