Cod sursa(job #2289198)

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