Cod sursa(job #929228)
#include<fstream>
#include<vector>
#define dim 16001
using namespace std;
int n,m,i,j,t[dim],c[dim],d[dim],b[3*dim],niv[3*dim],ap[3*dim],x,y,nr,tip,nod,ap2[3*dim];
vector<int>a[16001];
int rmq[15][3*dim],lg[3*dim];
inline void df(int x, int l)
{
b[++nr]=x;
niv[nr]=l;
ap[x]=nr;
d[x]=c[x]+d[t[x]];
for(int i=0;i<a[x].size();++i)
if(a[x][i]!=t[x])
{
t[a[x][i]]=x;
df(a[x][i],l+1);
b[++nr]=x;
ap2[x]=nr;
niv[nr]=l;
}
}
inline int lca(int x, int y)
{
int a,b,dif,l,sol;
a=ap[x];
b=ap[y];
if(a>b)
swap(a,b);
dif=b-a+1;
l=lg[dif];
sol=rmq[l][a];
if(niv[sol]>niv[ rmq[l][a+dif-(1<<l)]])
sol=rmq[l][a+dif-(1<<l)];
return sol;
}
inline void schimba(int x)
{
d[x]=c[x]+d[t[x]];
for(int i=0;i<a[x].size();++i)
if(a[x][i]!=t[x])
schimba(a[x][i]);
}
int main()
{
ifstream f("delay.in");
ofstream g("delay.out");
f>>n;
for(i=1;i<=n;++i)
f>>c[i];
for(i=1;i<n;++i)
{
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
df(1,1);
for(i=2;i<=nr;++i)
lg[i]=lg[i>>1]+1;
for(i=1;i<=nr;++i)
rmq[0][i]=i;
for(i=1;1<<i<nr;++i)
for(j=1;j<=nr-(1<<i);++j)
{
rmq[i][j]=rmq[i-1][j];
if(niv[rmq[i][j]]>niv[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
f>>m;
while(m--)
{
f>>tip>>x>>y;
if(tip==1)
{
c[x]=y;
for(i=ap[x];i<ap2[x];++i)
if(i==ap[b[i]])
d[b[i]]=c[b[i]]+d[t[b[i]]];
}
else
if(tip==2)
{
nod=b[lca(x,y)];
g<<d[x]+d[y]-2*d[nod]+c[nod]<<'\n';
}
}
}