Cod sursa(job #1043297)

Utilizator Kira96Denis Mita Kira96 Data 28 noiembrie 2013 12:04:02
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<fstream>
#include<vector>
#include<cmath>
#define N 1000100
#define logo 22
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int T[N],T2[N],h,n,i,lev[N],m,a,b;
void dfs(int nod,int t2,int lvl)
{
    lev[nod]=lvl;
    T2[nod]=t2;
    if(lvl%h==0)
    t2=nod;
    for(int i=1;i<=n;++i)
    if(T[i]==nod)
    dfs(i,t2,lvl+1);
}
int lca(int x,int y)
{
    while(T2[x]!=T2[y])
    if(lev[x]>lev[y])
    x=T2[x];
    else
    y=T2[y];
    while(x!=y)
    if(lev[x]>lev[y])
    x=T[x];
    else
    y=T[y];
    return x;
}
int main ()
{
    f>>n>>m;
    for(i=2;i<=n;++i)
        f>>T[i];
    h=(int)sqrt(n);
    dfs(1,0,0);
    for(i=1;i<=m;++i)
    {
        f>>a>>b;
        g<<lca(a,b)<<"\n";
    }
    return 0;
}