Cod sursa(job #3345641)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 10 martie 2026 15:50:03
Problema Heavy Path Decomposition Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <vector>
#define NMAX 100002
#define LOG 19
using namespace std;
ifstream  fin("heavypath.in");
ofstream fout("heavypath.out");
int N,M,v[NMAX],nivel[NMAX],up[NMAX][LOG];
vector<int>tree[NMAX];

void citire()
{
    fin>>N>>M;

    for(int i=1; i<=N; i++)
    {
        fin>>v[i];
    }

    int a,b;
    for(int i=1; i<N; i++)
    {
        fin>>a>>b;
        tree[a].push_back(b);
        tree[b].push_back(a);
    }
}

void DFS(int parent, int nod)
{
    for(int i=0; i<tree[nod].size(); i++)
    {
        int next_nod=tree[nod][i];

        if(next_nod!=parent)
        {
            nivel[next_nod]=nivel[nod]+1;

            up[next_nod][0]=nod;
            for(int j=1; j<LOG; j++)
            {
                up[next_nod][j]=up[up[next_nod][j-1]][j-1];
            }

            DFS(nod,next_nod);
        }
    }
}

int lca(int a, int b)
{
    if(nivel[a]<nivel[b])
    {
        swap(a,b);
    }

    int k=nivel[a]-nivel[b];
    for(int i=LOG-1; i>=0; i--)
    {
        if(k&(1<<i))
        {
            a=up[a][i];
        }
    }

    if(a==b)
    {
        return a;
    }

    for(int i=LOG-1; i>=0; i--)
    {
        if(up[a][i]!=up[b][i])
        {
            a=up[a][i];
            b=up[b][i];
        }
    }

    return up[a][0];
}

int query(int a, int b)
{
    int l=lca(a,b);

    int ans=v[l];
    while(a!=l)
    {
        ans=max(ans,v[a]);
        a=up[a][0];
    }

    while(b!=l)
    {
        ans=max(ans,v[b]);
        b=up[b][0];
    }


    return ans;
}

int main()
{
    citire();

    DFS(0,1);

    int op,x,y;
    for(int q=1; q<=M; q++)
    {
        fin>>op>>x>>y;

        if(op==0)
        {
            v[x]=y;
        }

        if(op==1)
        {
            fout<< query(x,y) << "\n";
        }
    }

    return 0;
}