Cod sursa(job #3308214)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 23 august 2025 17:55:51
Problema Heavy Path Decomposition Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.9 kb
#include <bits/stdc++.h>

using namespace std;

int v[100555];

int val[100555];

int n,m;

int top[100555];

int sz[100555];

vector <int> s[100555];

int hv[100555];

int pos[100555];

int parent[100555];

int mx[400555];

int dpt[100555];

void dfss(int k,int p,int dt)
{
    sz[k]=1;
    hv[k]=-1;
    dpt[k]=dt;
    for(auto a:s[k])
    {
        if(a!=p)
        {
            dfss(a,k,dt+1);
            sz[k]+=sz[a];
            if(hv[k]==-1 || sz[a]>sz[hv[k]])
            {
                hv[k]=a;
            }
        }
    }
}

int cnt=0;

void dfsh(int k,int p,int tp)
{
    top[k]=tp;
    parent[k]=p;
    ++cnt;
    pos[k]=cnt;
    val[pos[k]]=v[k];
    if(hv[k]!=-1)
    {
        dfsh(hv[k],k,tp);
    }
    for(auto a:s[k])
    {
        if(a!=p && a!=hv[k])
        {
            dfsh(a,k,a);
        }
    }
}

void up(int l,int r,int nval,int in,int el)
{
    int mij=(l+r)/2;
    if(l==r)
    {
        mx[el]=nval;
    }
    else
    {


    if(in>=l && in<=mij)
    {
        up(l,mij,nval,in,el*2);
    }
    else
    {
        up(mij+1,r,nval,in,el*2+1);
    }
    mx[el]=max(mx[el*2],mx[el*2+1]);
    }
}

int qr(int l,int r,int st,int dr,int el)
{
    if(dr<l || st>r)
    {
        return INT_MIN;
    }
     if(l>=st && r<=dr)
     {
         return mx[el];
     }
     else
     {
         int mij;
         mij=(l+r)/2;
         int mxx=INT_MIN;
         if(st<=mij)
         {
             int nrr=qr(l,mij,st,dr,el*2);
             if(nrr>mxx)
             {
                 mxx=nrr;
             }
         }
         if((mij+1)<=dr)
         {
             int nrr=qr(mij+1,r,st,dr,el*2+1);
             if(nrr>mxx)
             {
                 mxx=nrr;
             }
         }
         return mxx;
     }
}



int pq(int x,int y)
{
    int res=INT_MIN;
    //cout<<top[x]<<" "<<top[y]<<"\n";
    while(top[x]!=top[y])
    {
        if(dpt[top[x]]<dpt[top[y]])
        {
            swap(x,y);
        }
        res=max(res,qr(1,n,pos[top[x]],pos[x],1));
        x=parent[top[x]];
    }
    if(dpt[x]>dpt[y])
    {
        swap(x,y);
    }
    res=max(res,qr(1,n,pos[x],pos[y],1));
    return res;
}

int main()
{
    ifstream cin("heavypath.in");
    ofstream cout("heavypath.out");
    parent[1]=1;
    cin>>n>>m;
    int x,y;
    for(int i=1;i<=n;++i)
    {
        cin>>v[i];
    }
    for(int i=1;i<n;++i)
    {
        cin>>x>>y;
        s[x].push_back(y);
        s[y].push_back(x);
    }
    dfss(1,0,1);
    dfsh(1,0,1);
    int caz;

    for(int i=1;i<=n;++i)
    {
        up(1,n,v[i],pos[i],1);
    }
    for(int i=1;i<=m;++i)
    {
        cin>>caz;
        cin>>x>>y;
        if(caz==0)
        {
            up(1,n,y,pos[x],1);
        }
        else
        {


        cout<<pq(x,y)<<"\n";
        }
    }
    return 0;
}