Cod sursa(job #2045010)

Utilizator eragon0502Dumitrescu Dragos eragon0502 Data 21 octombrie 2017 18:01:21
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <vector>

using namespace std;

vector <int> v[100005];
int viz[100005];
int eu[500005],niv[100005],ne=0;
int rmq[500005][20];

void dfs(int k)
{
    if(viz[k]==0)
        viz[k]=ne+1;
    int size=v[k].size();
    for(int i=0;i<size;++i)
    {
        eu[++ne]=k;
        dfs(v[k][i]);
    }
    eu[++ne]=k;

}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int n,m,tmp,tmp1,tmp2,x,y;

    scanf("%d %d",&n,&m);

    for(int i=2;i<=n;++i)
    {
        scanf("%d",&tmp);
        v[tmp].push_back(i);
        niv[i]=niv[tmp]+1;
    }

    dfs(1);

    int log=0;
    for(log;(1<<(log+1))<ne;++log)
        log=log;

    for(int i=1;i<=ne;++i)
        rmq[i][0]=i;

    for(int j=1;j<=log;++j)
    {
        for(int i=1;i+(1<<(j-1))<=ne;++i)
        {
            if(niv[eu[rmq[i][j-1]]]<niv[eu[rmq[i+(1<<(j-1))][j-1]]])
                rmq[i][j]=rmq[i][j-1];
            else
                rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
        }
    }

    for(int t=1;t<=m;++t)
    {
        scanf("%d %d",&tmp1,&tmp2);
        x=viz[tmp1];
        y=viz[tmp2];
        int k=0;
        while((1<<(k+1))<y-x+1)
        {
            ++k;
        }
        if(niv[eu[rmq[x][k]]]<niv[eu[rmq[y-(1<<k)+1][k]]])
            printf("%d\n",eu[rmq[x][k]]);
        else
            printf("%d\n",eu[rmq[y-(1<<k)+1][k]]);
    }

    return 0;
}