Cod sursa(job #1937637)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 24 martie 2017 08:35:00
Problema Heavy Path Decomposition Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
const int Nmax=100001;
int val[Nmax],tata[Nmax],depth[Nmax];
vector<int>H[Nmax];
bitset<Nmax>viz;
void dfs(int nod,int dept,int fath)
{
    viz[nod]=1;
    depth[nod]=dept;
    tata[nod]=fath;
    for(unsigned i=0;i<H[nod].size();i++)
    {
        if(viz[H[nod][i]]==0) dfs(H[nod][i],dept+1,nod);
    }
}
int main()
{
    int n,m,i,a,b,maxi,t,x,y;
    fin>>n>>m;
    for(i=1;i<=n;i++) fin>>val[i];
    for(i=1;i<n;i++)
    {
        fin>>x>>y;
        H[x].push_back(y);
        H[y].push_back(x);
    }
    dfs(1,0,0);
    depth[1]=n+1;
    for(i=1;i<=m;i++)
    {
        fin>>t>>x>>y;
        if(t==0) val[x]=y;
        else
        {
            a=x;
            b=y;
            maxi=-1;
            b=b;
            while(1)
            {
                maxi=max(maxi,val[a]);
                maxi=max(maxi,val[b]);
                if(a==b) break;
                if(a==1) b=tata[b];
                else if(b==1) a=tata[a];
                else if(depth[a]<depth[b]) b=tata[b];
                else if(depth[b]<depth[a]) a=tata[a];
                else
                {
                    a=tata[a];
                    b=tata[b];
                }
            }
            fout<<maxi<<"\n";
        }
    }
}