Cod sursa(job #1343297)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 15 februarie 2015 10:57:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <list>
#include <bitset>
#define DIM 100011
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,k;
int p[2*DIM],F[DIM],a[21][2*DIM];
pair<int,int> E[2*DIM];

list<int> L[DIM];

void dfs(int nod,int niv){
    list<int>::iterator it;
    E[++k]=make_pair(nod,niv);
    if(!F[nod]) F[nod]=k;
    for(it=L[nod].begin();it!=L[nod].end();it++)
        dfs(*it,niv+1),E[++k]=make_pair(nod,niv);
}

int main(void){
    register int y,i,j,b,jv,x;

    f>>n>>m;
    for(i=2;i<=n;i++){
        f>>x;
        L[x].push_back(i);
    }

    dfs(1,0);
    a[0][1]=1;
    for(i=2;i<=k;i++) p[i]=1+p[i/2],a[0][i]=i;
    for(i=1;(1<<i)<=k;i++){
        for(j=1;j<=k;j++){
            a[i][j]=a[i-1][j],jv=((1<<(i-1))+j);
            if(jv<=k && E[a[i][j]].second>=E[a[i-1][jv]].second)
                a[i][j]=a[i-1][jv];
        }
    }

    for(i=1;i<=m;i++){
        f>>x>>y;
        x=F[x],y=F[y];
        if(x>y) swap(x,y);
        b=p[y-x+1];
        jv=(y-(1<<b)+1);
        if(E[a[b][x]].second<E[a[b][jv]].second)
            g<<E[a[b][x]].first<<"\n";
        else
            g<<E[a[b][jv]].first<<"\n";
    }
    f.close();
    g.close();
    return 0;
}