Pagini recente » Clasament jc2025rd1 | Cod sursa (job #1483370) | Cod sursa (job #421192) | Cod sursa (job #3340705) | Cod sursa (job #3345641)
#include <fstream>
#include <vector>
#define NMAX 100002
#define LOG 19
using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
int N,M,v[NMAX],nivel[NMAX],up[NMAX][LOG];
vector<int>tree[NMAX];
void citire()
{
fin>>N>>M;
for(int i=1; i<=N; i++)
{
fin>>v[i];
}
int a,b;
for(int i=1; i<N; i++)
{
fin>>a>>b;
tree[a].push_back(b);
tree[b].push_back(a);
}
}
void DFS(int parent, int nod)
{
for(int i=0; i<tree[nod].size(); i++)
{
int next_nod=tree[nod][i];
if(next_nod!=parent)
{
nivel[next_nod]=nivel[nod]+1;
up[next_nod][0]=nod;
for(int j=1; j<LOG; j++)
{
up[next_nod][j]=up[up[next_nod][j-1]][j-1];
}
DFS(nod,next_nod);
}
}
}
int lca(int a, int b)
{
if(nivel[a]<nivel[b])
{
swap(a,b);
}
int k=nivel[a]-nivel[b];
for(int i=LOG-1; i>=0; i--)
{
if(k&(1<<i))
{
a=up[a][i];
}
}
if(a==b)
{
return a;
}
for(int i=LOG-1; i>=0; i--)
{
if(up[a][i]!=up[b][i])
{
a=up[a][i];
b=up[b][i];
}
}
return up[a][0];
}
int query(int a, int b)
{
int l=lca(a,b);
int ans=v[l];
while(a!=l)
{
ans=max(ans,v[a]);
a=up[a][0];
}
while(b!=l)
{
ans=max(ans,v[b]);
b=up[b][0];
}
return ans;
}
int main()
{
citire();
DFS(0,1);
int op,x,y;
for(int q=1; q<=M; q++)
{
fin>>op>>x>>y;
if(op==0)
{
v[x]=y;
}
if(op==1)
{
fout<< query(x,y) << "\n";
}
}
return 0;
}