Cod sursa(job #1134232)

Utilizator kiralalaChitoraga Dumitru kiralala Data 6 martie 2014 11:22:26
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
#define pb push_back
#define NMAX 100005

using namespace std;

typedef vector<int>::iterator iter;
FILE* f=freopen("lca.in","r",stdin);
FILE* o=freopen("lca.out","w",stdout);

int n,m;
vector<int> G[NMAX];
int lvl[NMAX];
int ftr[NMAX],gftr[NMAX];
const int h=200;

void DFS(int x, int lv, int gf)
{
    lvl[x]=lv;
    gftr[x]=gf;
    if(lv%h==0) gf=x;
    for(iter i=G[x].begin();i<G[x].end();++i)
    {
        if(!lvl[*i])
        {
            DFS(*i,lv+1,gf);
        }
    }
}

int LCA(int a, int b)
{
    while(gftr[a]!=gftr[b])
    {
        if(lvl[a]<lvl[b])
        {
            b=gftr[b];
        }
        else
        {
            a=gftr[a];
        }
    }
    while(a!=b)
    {
        if(lvl[a]<lvl[b])
        {
            b=ftr[b];
        }
        else
        {
            a=ftr[a];
        }
    }
    return a;
}

int main()
{
    scanf("%d%d",&n,&m);

    for(int i=2;i<=n;++i)
    {
        scanf("%d",&ftr[i]);
        G[ftr[i]].pb(i);
    }

    DFS(1,0,0);

    for(int i=1;i<=m;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",LCA(x,y));
    }

    return 0;
}