Cod sursa(job #1382462)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 9 martie 2015 02:06:22
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#define nmax 100005
using namespace std;
vector <int> a[nmax];
ifstream f("lca.in");
ofstream g("lca.out");
int v[19][nmax*4],k,log[nmax*4];
int n,m,niv[nmax],viz[nmax],prim[nmax];


void dfs(int x,int nivel)
{
    int i,y;
    v[0][++k]=x;
    if (prim[x]==0)
        prim[x]=k;
    viz[x]=1;
    niv[x]=nivel;
    vector <int> ::iterator it=a[x].begin();
    for (;it!=a[x].end();it++) {
        y=*it;
        if (viz[y]==0) {
            dfs(y,nivel+1);
            v[0][++k]=x;
            if (prim[x]==0)
                prim[x]=k;
        }
    }
}
int query(int x,int y)
{
    if (x>y)
        swap(x,y);
    int l=(y-x+1);
    int lg=log[l];
    int a=v[lg][x],b=v[lg][y-(1<<lg)+1];
    if (niv[a]<niv[b])
        return a;
    return b;


}
void rmq()
{
    int i,j,x,y;
    for (i=2;i<=k;i++)
        log[i]=log[i/2]+1;
    for (i=1;(1<<i)<=k;i++)
        for (j=1;j+(1<<i)<=k;j++) {
            x=v[i-1][j];
            y=v[i-1][j+(1<<(i-1))];
            if (niv[x]<niv[y])
                v[i][j]=x;
            else
                v[i][j]=y;
        }

}
int main()
{
    int i,j,x,y;
    f>>n>>m;
    for (i=2;i<=n;i++) {
        f>>x;
        a[x].push_back(i);
    }
    dfs(1,0);
    rmq();
    for (i=1;i<=m;i++) {
        f>>x>>y;
        g<<query(prim[x],prim[y])<<'\n';
    }
    return 0;
}