Cod sursa(job #929228)

Utilizator valentina506Moraru Valentina valentina506 Data 26 martie 2013 22:07:56
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#include<vector>
#define dim 16001
using namespace std;
int n,m,i,j,t[dim],c[dim],d[dim],b[3*dim],niv[3*dim],ap[3*dim],x,y,nr,tip,nod,ap2[3*dim];
vector<int>a[16001];
int rmq[15][3*dim],lg[3*dim];
inline void df(int x, int l)
{
    b[++nr]=x;
    niv[nr]=l;
    ap[x]=nr;
    d[x]=c[x]+d[t[x]];
    for(int i=0;i<a[x].size();++i)
    if(a[x][i]!=t[x])
    {
        t[a[x][i]]=x;
        df(a[x][i],l+1);
        b[++nr]=x;
        ap2[x]=nr;
        niv[nr]=l;
    }
}
inline int lca(int x, int y)
{
    int a,b,dif,l,sol;
    a=ap[x];
    b=ap[y];
    if(a>b)
    swap(a,b);
    dif=b-a+1;
    l=lg[dif];
    sol=rmq[l][a];
    if(niv[sol]>niv[ rmq[l][a+dif-(1<<l)]])
    sol=rmq[l][a+dif-(1<<l)];
    return sol;
}
inline void schimba(int x)
{
    d[x]=c[x]+d[t[x]];
    for(int i=0;i<a[x].size();++i)
    if(a[x][i]!=t[x])
        schimba(a[x][i]);
}
int main()
{
    ifstream f("delay.in");
    ofstream g("delay.out");
    f>>n;
    for(i=1;i<=n;++i)
    f>>c[i];
    for(i=1;i<n;++i)
    {
        f>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    df(1,1);
    for(i=2;i<=nr;++i)
    lg[i]=lg[i>>1]+1;
    for(i=1;i<=nr;++i)
    rmq[0][i]=i;

    for(i=1;1<<i<nr;++i)
    for(j=1;j<=nr-(1<<i);++j)
    {
        rmq[i][j]=rmq[i-1][j];
        if(niv[rmq[i][j]]>niv[rmq[i-1][j+(1<<(i-1))]])
        rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
    }
    f>>m;
    while(m--)
    {
        f>>tip>>x>>y;
        if(tip==1)
        {
            c[x]=y;
            for(i=ap[x];i<ap2[x];++i)
            if(i==ap[b[i]])
            d[b[i]]=c[b[i]]+d[t[b[i]]];

        }
        else
        if(tip==2)
            {
                nod=b[lca(x,y)];
                g<<d[x]+d[y]-2*d[nod]+c[nod]<<'\n';
            }
    }
}