Cod sursa(job #3032915)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 23 martie 2023 07:08:10
Problema Heavy Path Decomposition Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
typedef long long ll;
ifstream in("heavypath.in");
ofstream out("heavypath.out");
int n,m,i,j,k,l,a[100001],e[600001],ef[100001],s[100001],le[100001],t[100001],u[100001],p[100001],b[400001],*o[100001],c[100001],x,y,z,r,w,f[100001];vector<int>g[100001];
void dfs(int v)
{
    s[v]=1;
    for(auto i:g[v])
        if(le[i]==0)
    {
        le[i]=le[v]+1,dfs(i),s[v]+=s[i],f[c[i]]=v;
        if(s[i]>s[c[v]])c[v]=i;
    }
    c[v]=c[c[v]];
    if(c[v]==0)c[v]=++l,t[l]=1,p[l]=le[v];
    else ++t[c[v]];
}
void d2(int v)
{
    for(auto i:g[v])
        if(le[i]>le[v])
            d2(i);
    o[c[v]][p[c[v]]-le[v]+u[c[v]]]=a[v];
}
int main()
{
//ios_base::sync_with_stdio(false);
//in.tie(nullptr),out.tie(nullptr);
in>>n>>m;
for(k=1;k<=n;k++)
    in>>a[k];
for(k=1;k<n;k++)
    in>>i>>j,g[i].push_back(j),g[j].push_back(i);
le[1]=1,k=1<<18,le[0]=INT_MAX;
dfs(1);
//for(i=(1<<18)-1;i>0;i--)e[i]=le[e[i*2]]<le[e[i*2+1]]?e[i*2]:e[i*2+1];
f[c[1]]=0;
k=0;
for(i=1;i<=l;i++)
{
    u[i]=t[i]*2-1;
    while(u[i]&(u[i]-1))u[i]&=u[i]-1;
    o[i]=b+k,k+=u[i]*2;
}
d2(1);
for(i=1;i<=l;i++)
    for(j=u[i]-1;j;j--)
        o[i][j]=bmax(o[i][j*2],o[i][j*2+1]);
while(m--)
{
    in>>r>>x>>y;
    if(r==0)
    {
        i=p[c[x]]-le[x]+u[c[x]];
        o[c[x]][i]=y;
        while(i>1)o[c[x]][i/2]=bmax(o[c[x]][i],o[c[x]][i^1]),i>>=1;
    }
    else{
        w=0;
        while(c[x]!=c[y])
        {
            if(p[c[x]]-t[c[x]]<p[c[y]]-t[c[y]])sw(x,y);
            if(le[x]!=p[c[x]])
            {
                i=p[c[x]]-le[x]+u[c[x]];bmaxify(w,o[c[x]][i]);
                for(;i>1;i/=2)
                    if((i&1)==0)
                        bmaxify(w,o[c[x]][i^1]);}
                else bmaxify(w,o[c[x]][1]);
            x=f[c[x]];

        }
        if(le[x]<le[y])sw(x,y);
        i=p[c[x]]-le[x]+u[c[x]];bmaxify(w,o[c[x]][i]);
        j=p[c[x]]-le[y]+u[c[x]];bmaxify(w,o[c[x]][j]);
        while((i^j)>1)
        {
            if((i&1)==0)bmaxify(w,o[c[x]][i^1]);
            if((j&1)==1)bmaxify(w,o[c[x]][j^1]);
            i/=2,j/=2;
        }

        out<<w<<'\n';
    }
}
}