Cod sursa(job #2289045)

Utilizator bogdi1bogdan bancuta bogdi1 Data 24 noiembrie 2018 10:43:06
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int parc[300005];
vector<int> g[100005];
bool viz[100005];
int rmq[100005][20];
int k;
int logx[100005];
int ap[100005];
void dfs(int nod)
{
    parc[++k]=nod;
    for(int i=0; i<g[nod].size(); i++)
        if(viz[g[nod][i]]==0){
            viz[g[nod][i]]=1;
            dfs(g[nod][i]);
            parc[++k]=nod;
        }
}
int main()
{   freopen("lca.in", "r",stdin);
    freopen("lca.out", "w",stdout);
    int n,m,i,x,j,y,l;
    scanf("%d%d", &n, &m);
    for(i=2; i<=n; i++){
        scanf("%d", &x);
        g[x].push_back(i);
    }
    dfs(1);
    for(i=1; i<=k; i++){
        if(ap[parc[i]]==0)
            ap[parc[i]]=i;
        rmq[i][0]=parc[i];
        for(j=1; (1<<j)<=i; j++)
            rmq[i][j]=min(rmq[i][j-1], rmq[i-(1<<(j-1))][j-1]);
    }
    logx[1]=0;
    for(i=2; i<=n; i++)
        logx[i]=1+logx[i/2];
    for(i=1; i<=m; i++){
        scanf("%d%d", &x, &y);
        x=ap[x];
        y=ap[y];
        l=logx[abs(y-x)+1];
        printf("%d\n", min(rmq[max(x,y)][l], rmq[min(x,y)+(1<<l)-1][l]));
    }
    return 0;
}