Cod sursa(job #3032914)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 23 martie 2023 07:03:30
Problema Heavy Path Decomposition Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.96 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,ef[v]=k,e[k++]=v;
    for(auto i:g[v])
        if(le[i]==0)
    {
        le[i]=le[v]+1,dfs(i),s[v]+=s[i],e[k++]=v,f[c[i]]=v;
        if(s[i]>s[c[v]])c[v]=i;
    }
    c[v]=c[c[v]];
    //cout<<v<<' '<<c[v]<<' '<<s[c[v]]<<'\n';
    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);
    //cout<<v<<' '<<p[c[v]]-le[v]+u[c[v]]<<'\n';
    o[c[v]][p[c[v]]-le[v]+u[c[v]]]=a[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;i<=n;i++)cout<<i<<' '<<le[i]<<' '<<s[i]<<"    "<<c[i]<<' '<<p[c[i]]<<' '<<t[c[i]]<<'\n';
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];
//while(true)cin>>i,cout<<e[i]<<endl;
f[c[1]]=0;
//for(i=0;i<=l;i++)cout<<i<<' '<<f[i]<<'\n';
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;
    //cout<<o[i]-b<<"U"<<o[i]-b+u[i]<<'\n';
}
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]);
//for(i=0;i<k;i++)cout<<b[i]<<' ';
while(m--)
{
    in>>r>>x>>y;
    if(r==0)
    {
        i=p[c[x]]-le[x]+u[c[x]];
        o[c[x]][i]=y;
        //cout<<"t"<<x<<' '<<y<<' '<<i<<'\n';
        while(i>1)o[c[x]][i/2]=bmax(o[c[x]][i],o[c[x]][i^1]),i>>=1;
        //for(i=0;i<u[c[x]]*2;i++)cout<<o[c[x]][i]<<' ';cout<<endl;
    }
    else{
        w=0;
        while(c[x]!=c[y])
        {
            if(p[c[x]]-t[c[x]]<p[c[y]]-t[c[y]])sw(x,y);
            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]);
            x=f[c[x]];
        }
        //cout<<x<<' '<<y<<' '<<w<<'\n';
        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]);
        //cout<<x<<' '<<y<<' '<<le[x]<<' '<<le[y]<<' '<<i<<' '<<j<<'\n';
        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';
    }
}
}