Pagini recente » Cod sursa (job #66495) | Cod sursa (job #2022485) | Cod sursa (job #1228744) | Cod sursa (job #2023031) | Cod sursa (job #3130628)
#include <bits/stdc++.h>
using namespace std;
ifstream f("heavypath.in");
ofstream g("heavypath.out");
const int MN = 1e5+5;
const int MB = 20;
int n,q;
vector<int> adj[MN];
int par[MN];
int h[MN], lcap[MN], l[MN], lk;
int hcop[MN];
int siz[MN];
int v[MN];
void initdfs(int nod)
{
h[nod]=h[par[nod]]+1;
siz[nod]=1;
int mx=0;
for(auto e:adj[nod]) if(e!=par[nod])
{
par[e]=nod;
initdfs(e);
siz[nod]+=siz[e];
if(siz[e]>siz[mx]) mx=e;
}
if(mx==0)
{
l[nod]=++lk;
lcap[lk]=nod;
}
else
{
l[nod]=l[mx];
lcap[l[nod]]=nod;
}
hcop[nod]=mx;
}
int arbint[MN*2];
int apoz[MN], ak;
void arbintup(int up, int uv)
{
for( arbint[up+=n] = uv; up>1; up>>=1)
{
arbint[up>>1]= max(arbint[up], arbint[up^1]);
}
}
int arbintquery(int qst, int qdr)
{
int ans=0;
for(qst+=n, qdr+=n; qst<qdr; qst>>=1, qdr>>=1)
{
if (qst&1) ans=max(ans, arbint[qst++]);
if (qdr&1) ans=max(ans, arbint[--qdr]);
}
return ans;
}
void arbintdfs(int nod)
{
arbintup(ak, v[nod]);
apoz[nod]=ak++;
if(hcop[nod]!=0)
{
arbintdfs(hcop[nod]);
}
for(auto e:adj[nod]) if(par[nod]!=e&&hcop[nod]!=e)
{
arbintdfs(e);
}
}
int doquery(int a, int b)
{
int ans=0;
while(l[a]!=l[b])
{
if(h[a]<h[b]) swap(a,b);
ans= max(ans , arbintquery( apoz[ lcap[l[a] ] ], apoz [a] + 1));
a = par[ lcap[ l[a] ] ];
}
if(h[a]>h[b]) swap(a,b);
ans= max(ans, arbintquery( apoz[a], apoz[b]+1));
return ans;
}
int main()
{
f>>n>>q;
int a,b,c;
for(int i=1;i<=n;i++)
{
f>>v[i];
}
for(int i=1;i<n;i++)
{
f>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
initdfs(1);
arbintdfs(1);
for(int i=1;i<=q;i++)
{
f>>a>>b>>c;
if(a==0)
{
arbintup(apoz[b],c);
}
else
{
g<<doquery(b, c)<<'\n';
}
}
return 0;
}