Cod sursa(job #2986938)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 1 martie 2023 17:47:34
Problema Heavy Path Decomposition Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.76 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");
#define I (1<<18)
int n,m,l[100001],i,j,k,a[200001],t[2][100001],f[100001],s[100001],e[18][200001],d[100001],z,x,y,p[100001],r,w;vector<int>g[100001],h[100001];
void df(int v)
{
    p[v]=k,e[0][k++]=v,s[v]=1;
    for(auto i:g[v])
        if(l[i]==0)
        {
            l[i]=l[v]+1,df(i);
            s[v]+=s[i],e[0][k++]=v;
            if(s[i]>s[t[0][v]])t[0][v]=i,t[1][v]=t[1][i];
        }
    if(t[0][v]==0)t[0][v]=t[1][v]=v;
    h[t[1][v]].push_back(v);
}
void q(int x,int y,int z)
{
    //cout<<x<<' '<<y<<' '<<z<<'\n';
    if(z>=i&&z+y-1<=j)
        bmaxify(w,h[r][x]);
        else if(y>1)
        {
            if(z+y/2-1>=i)q(x*2,y/2,z);
            if(z+y/2<=j)q(x*2+1,y/2,z+y/2);
        }
}
int main()
{
in>>n>>m;
for(i=1;i<=n;i++)in>>a[i];
for(z=1;z<n;z++)in>>i>>j,g[i].push_back(j),g[j].push_back(i);
l[1]=1,df(1);
//for(i=1;i<=n;i++)cout<<i<<' '<<t[0][i]<<' '<<t[1][i]<<'\n';
for(i=0;i<17;i++)
{
    for(j=0;j<k;j++)
        if(j+(1<<i)>=k||l[e[i][j]]<l[e[i][j+(1<<i)]])
            e[i+1][j]=e[i][j];
            else e[i+1][j]=e[i][j+(1<<i)];
}
/*for(i=0;i<4;i++,cout<<'\n')
    for(j=0;j<k;j++)
        cout<<e[i][j]<<' '<<l[e[i][j]]<<"  ";*/
for(i=1;i<=n;i++)
    if(h[i].size())
{
    j=h[i].size(),t[0][i]=h[i][h[i].size()-1],z=2*j-1;
    //cout<<i<<' '<<j<<'\n';
    z|=z>>1,z|=z>>2,z|=z>>4,z|=z>>8,z|=z>>16,z^=z>>1;
    h[i].reserve(2*z);
    //cout<<i<<' '<<j<<' '<<z<<'\n';
    for(x=0;x<j;x++)h[i][x+z]=a[h[i][x]]/*,cout<<h[i][x]<<' '<<h[i][x+z]<<"  "*/;
    while(x<z)h[i][(x++)+z]=0;

    for(j=z-1;j>=1;j--)h[i][j]=bmax(h[i][2*j],h[i][2*j+1]);
    //cout<<'\n';
}
a[1]=0;for(i=2;i<=2*n;i++)a[i]=a[i/2]+1;
while(m--)
{
in>>r>>x>>y;
if(r==0)
{
    i=h[t[1][x]].capacity()/2+l[t[1][x]-l[x]],h[t[1][x]][i]=y;
    //cout<<i<<' '<<h[t[1][x]].capacity()/2<<' '<<l[x]<<' '<<l[t[1][x]]<<'\n';
    while(i>1)
        h[t[1][x]][i/2]=bmax(h[t[1][x]][i],h[t[1][x]][i^1]),i/=2;
    //cout<<t[1][x]<<' '<<h[t[1][x]].capacity()<<' '<<h[t[1][x]].size()<<' '<<y<<"t\n";
    //for(i=1;i<h[t[1][x]].capacity();i*=2,cout<<endl)for(j=i;j<2*i;j++)cout<<h[t[1][x]][j]<<' ';
}
else{
    if(p[x]>p[y])sw(x,y);
    z=p[y]-p[x]+1;
    //cout<<x<<' '<<y<<' '<<z<<' '<<a[z]<<'\n'<<p[x]<<' '<<l[e[a[z]][p[x]]]<<' '<<p[y]+1-(1<<a[z])<<' '<<l[e[a[z]][p[y]+1-(1<<a[z])]]<<'\n';
    if(l[e[a[z]][p[x]]]<l[e[a[z]][p[y]+1-(1<<a[z])]])
        z=e[a[z]][p[x]];
        else z=e[a[z]][p[y]+1-(1<<a[z])];
    w=h[t[1][z]][h[t[1][z]].capacity()/2+l[t[1][z]]-l[z]];
    //cout<<'\n'<<x<<' '<<y<<' '<<z<<' '<<w<<'\n';
    while(l[x]>l[z])
    {
        i=l[t[1][x]]-l[x];//cout<<t[1][x]<<' ';
        if(t[1][z]==t[1][x])
            j=l[t[1][z]]-l[z];
            else j=l[t[1][x]]-l[t[0][t[1][x]]];
        r=t[1][x];//cout<<z<<' '<<x<<' '<<r<<' '<<i<<' '<<j<<'\n';
        //cout<<i<<' '<<j<<' '<<x<<"AA\n";
        q(1,h[r].capacity()/2,0);
        x=e[0][p[t[0][t[1][x]]]-1];//cout<<i<<' '<<j<<' '<<x<<"   ";
    }
    x=y;
    while(l[x]>l[z])
    {
        i=l[t[1][x]]-l[x];//cout<<t[1][x]<<' ';
        if(t[1][z]==t[1][x])
            j=l[t[1][z]]-l[z];
            else j=l[t[1][x]]-l[t[0][t[1][x]]];
        r=t[1][x];
        //cout<<i<<' '<<j<<' '<<x<<"BB\n";
        q(1,h[r].capacity()/2,0);
        x=e[0][p[t[0][t[1][x]]]-1];//cout<<i<<' '<<j<<' '<<x<<"   ";
    }
    out<<w<<'\n';//cout<<"\n\n";
}
}
}