Cod sursa(job #1651382)

Utilizator SilviuIIon Silviu SilviuI Data 13 martie 2016 09:51:18
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define nmax 100010

using namespace std;

struct date { int x,niv; };

int n,m,x,nr,y;
int pos[nmax],v[nmax];
date rmq[18][nmax];
bool fr[nmax];
vector <int> g[nmax];

inline date minn(date x,date y)
{
    if (x.niv<y.niv) return x; else
        return y;
}

void dfs(int x,int niv)
{
    nr++; rmq[0][nr].x=x; rmq[0][nr].niv=niv; pos[x]=nr; fr[x]=true;

    for (int i=0;i<(int)g[x].size();i++)
        if (!fr[g[x][i]]) {
            dfs(g[x][i],niv+1);
            nr++; rmq[0][nr].x=x; rmq[0][nr].niv=niv;
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);

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

    for (int i=1;i<=n-1;i++) {
        scanf("%d",&x);
        g[x].push_back(i+1);
        g[i+1].push_back(x);
    }

    dfs(1,0);

    for (int i=2;i<=nr;i++) v[i]=v[i/2]+1;

    for (int i=1;(1<<i)<=nr;i++) {
        int aux=1<<(i-1);
        for (int j=1;j<=nr-aux;j++)
            rmq[i][j]=minn(rmq[i-1][j],rmq[i-1][j+aux]);
    }

    for (int i=1;i<=m;i++) {
        scanf("%d %d",&x,&y); x=pos[x]; y=pos[y];
        if (x>y) swap(x,y);
        int dif=v[(y-x+1)]; int p=1<<dif;
        printf("%d\n",minn(rmq[dif][x],rmq[dif][y-p+1]).x);
    }

    return 0;
}