Cod sursa(job #1309570)

Utilizator acomAndrei Comaneci acom Data 5 ianuarie 2015 21:00:22
Problema Heavy Path Decomposition Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.93 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
#define NMAX 100005
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
vector <int> v[NMAX],Lant[NMAX];
bitset <NMAX> viz;
int n,m,k,t,x,y,q,a[NMAX],D[NMAX],Niv[NMAX],Tata[NMAX],Nr[NMAX];
int A[NMAX<<2],Start[NMAX],T[NMAX],X[NMAX];
void dfs(int nod, int niv, int tata)
{
    int i,fiu,fmax=0;
    Niv[nod]=niv, Tata[nod]=tata, viz[nod]=1;
    D[nod]=1;
    for (i=0;i<v[nod].size();++i)
    {
        fiu=v[nod][i];
        if (!viz[fiu])
        {
            dfs(fiu,niv+1,nod);
            D[nod]+=D[fiu];
            if (D[fmax]<D[fiu])
                fmax=fiu;
        }
    }
    if (!fmax)
    {
        ++k;
        Lant[k].push_back(nod);
        Nr[nod]=k;
        T[k]=Tata[nod];
    }
    else
    {
        Nr[nod]=Nr[fmax];
        Lant[Nr[nod]].push_back(nod);
        T[Nr[nod]]=Tata[nod];
    }
}
void update(int nod, int st, int dr, int p, int x, int decalaj)
{
    if (st==dr)
    {
        A[nod+decalaj]=x;
        return ;
    }
    int mij=(st+dr)>>1;
    if (p<=mij)
        update(nod<<1,st,mij,p,x,decalaj);
    else
        update(1+(nod<<1),mij+1,dr,p,x,decalaj);
    A[nod+decalaj]=max(A[(nod<<1)+decalaj],A[1+(nod<<1)+decalaj]);
}
int query(int nod, int st, int dr, int a, int b, int decalaj)
{
    if (a<=st && dr<=b)
        return A[nod+decalaj];
    int mij=(st+dr)>>1,qu=0;
    if (a<=mij)
        qu=max(qu,query(nod<<1,st,mij,a,b,decalaj));
    if (mij<b)
        qu=max(qu,query(1+(nod<<1),mij+1,dr,a,b,decalaj));
    return qu;
}
int main()
{
    int i,j,jj;
    fin>>n>>m;
    for (i=1;i<=n;++i)
        fin>>a[i];
    for (i=1;i<n;++i)
    {
        fin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1,1,0);
    for (i=1;i<=k;++i)
    {
        Start[i]=Start[i-1]+(Lant[i-1].size()<<2);
        for (j=0,jj=Lant[i].size()-1;j<jj;++j,--jj)
        {
            swap(Lant[i][j],Lant[i][jj]);
            X[Lant[i][j]]=j;
            X[Lant[i][jj]]=jj;
        }
        X[Lant[i][j]]=j;
    }
    for (i=1;i<=n;++i)
        update(1,0,Lant[Nr[i]].size()-1,X[i],a[i],Start[Nr[i]]);
    for (i=1;i<=m;++i)
    {
        fin>>t>>x>>y;
        if (!t)
            update(1,0,Lant[Nr[x]].size()-1,X[x],y,Start[Nr[x]]);
        else
        {
            if (Niv[T[Nr[x]]]>Niv[T[Nr[y]]])
                swap(x,y);
            q=0;
            do
            {
                if (Niv[T[Nr[x]]]>Niv[T[Nr[y]]])
                    swap(x,y);
                if (Nr[x]==Nr[y])
                {
                    q=max(q,query(1,0,Lant[Nr[x]].size()-1,min(X[x],X[y]),max(X[x],X[y]),Start[Nr[x]]));
                    break;
                }
                q=max(q,query(1,0,Lant[Nr[y]].size()-1,0,X[y],Start[Nr[y]]));
                y=T[Nr[y]];
            } while (1);
            fout<<q<<"\n";
        }
    }
    return 0;
}