Cod sursa(job #2301149)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 12 decembrie 2018 18:25:02
Problema Heavy Path Decomposition Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.76 kb
#include <fstream>
#include <cstring>
#include <queue>
#define DIM 100001
#include<algorithm>
using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
int sol,nr,n,m,i,a,b,lnr,d[DIM],niv[DIM],f[DIM],t[DIM],c[DIM],poz[DIM],z;
vector<int> v[DIM],l[DIM],aib[DIM];
void build(int tip,int nod, int st, int dr)
{
    if(st==dr)
    {while(aib[tip].size()<=nod)aib[tip].push_back(0);aib[tip][nod-1]=c[l[tip][++nr]];}
    else
    {
        int mid=(st+dr)/2;build(tip,2*nod, st, mid);build(tip,2*nod+1, mid+1, dr);
        aib[tip][nod-1]=max(aib[tip][2*nod-1],aib[tip][2*nod]);
    }
}
void update(int tip,int nod,int st,int dr,int poz,int val)
{
    if(st==dr)aib[tip][nod-1]=val;
    else
    {
        int mid=(st+dr)/2;
        if(poz<=mid)update(tip,2*nod, st, mid, poz, val);
        if(poz>mid)update(tip,2*nod+1, mid+1, dr, poz, val);
        aib[tip][nod-1]=max(aib[tip][2*nod-1],aib[tip][2*nod]);
    }
}
void vas(int tip,int nod, int st, int dr, int x, int y)
{
    if(x<=st&&y>=dr)sol=max(sol, aib[tip][nod-1]);
    else
    {
        int mid=(st+dr)/2;
        if(x<=mid)vas(tip,2*nod,st,mid,x,y);
        if(mid+1<=y)vas(tip,2*nod+1,mid+1,dr,x,y);
    }
}
void dfs(int nod,int tata,int nivel)
{
    int maxi=0,aux,vecin,i;
    niv[nod]=nivel;
    if(v[nod].size()==1&&nod!=1)
    {
        l[++lnr].push_back(nod);
        f[nod]=lnr;poz[nod]=l[f[nod]].size();
    }
    for(i=0;i<v[nod].size();i++)
    {
        vecin=v[nod][i];if(vecin==tata)continue;
        dfs(vecin,nod,niv[nod]+1);d[nod]+=d[vecin];
        if(maxi<d[vecin]){maxi=d[vecin];aux=i;}
    }
    for(i=0;i<v[nod].size();i++)
    {vecin=v[nod][i];if(vecin==tata)continue;if(i!=aux)t[f[vecin]]=nod;else{l[f[vecin]].push_back(nod);f[nod]=f[vecin];poz[nod]=l[f[nod]].size();}}
    d[nod]++;
}
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)fin>>c[i];
    for(i=1;i<n;i++){fin>>a>>b;v[a].push_back(b);v[b].push_back(a);}
    dfs(1,0,1);
    for(i=1;i<=n;i++)if(v[i].size()==1)
    {nr=-1;build(f[i],1,1,l[f[i]].size());}
    for(i=1;i<=m;i++)
    {
        fin>>z>>a>>b;
        if(z==0)update(f[a],1,1,l[f[a]].size(),poz[a],b);
        else
        {
            sol=0;
            while(f[a]!=f[b])
            {
                if(niv[t[f[a]]]<niv[t[f[b]]])
                {
                    vas(f[b],1,1,l[f[b]].size(),poz[b],l[f[b]].size());
                    b=t[f[b]];
                }
                else
                {
                    vas(f[a],1,1,l[f[a]].size(),poz[a],l[f[a]].size());
                    a=t[f[a]];
                }
            }
            if(poz[a]>poz[b]) swap(a,b);
            vas(f[a],1,1,l[f[a]].size(),poz[a],poz[b]);
            fout<<sol<<"\n";
        }
    }
    return 0;
}