Cod sursa(job #2091483)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 19 decembrie 2017 18:50:56
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.64 kb
//lacusta-oji, 2005
/*#include<bits/stdc++.h>
#define oo 32000
#define Dim 252
using namespace std;
int main()
{   int i,j,jmin,min1,min2,ans,n,m,b[Dim][Dim];
short int a[Dim][Dim];
    freopen("lacusta.in","r",stdin);
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        scanf("%d",&a[i][j]);

    b[0][0]=(int)a[0][0];
    b[1][0]=oo;
    for(i=1;i<n;i++)
        b[1][i]=(int)a[0][0]+(int)a[0][i]+(int)a[1][i];
    for(i=1;i<m-1;i++)
    {
        if(b[i%2][0]<=b[i%2][1])
        {
            min1=b[i%2][0];
            min2=b[i%2][1];
            jmin=0;
        }
        else
            {jmin=1;
        min1=b[i%2][1];
        min2=b[i%2][0];
            }

        for(j=2;j<n;j++)
            if(b[i%2][j]<min1)
        {
            min2=min1;
            min1=b[i%2][j];
            jmin=j;
        }
        else
            if(b[i%2][j]<min2)
            min2=b[i%2][j];

        for(j=0;j<n;j++)
            if(j!=jmin) b[(i+1)%2][j]=(int)(min1+a[i][j]+a[i+1][j]);
              else b[(i+1)%2][j]=(int)(min2+a[i][j]+a[i+1][j]);

    }
    ans=b[(m-1)%2][0];
    for(j=1;j<n;j++)
        if(ans>b[(m-1)%2][j]) ans=b[(m-1)%2][j];
    freopen("lacusta.out","w",stdout);
    cout<<(ans+a[m-1][n-1]);
    //cout<<double(clock()-start)/double(CLOCKS_PER_SEC);
    return 0;
}*/

//LCA-met1


#include<bits/stdc++.h>
#define N 100004
using namespace std;
int n,m,T[N],R[N],T2[N],Lev[N],H,ad=-N;

void dfs(int nod, int dist)
{   int i;
    R[nod]=dist;
    if(dist>ad) ad=dist;
    for(i=1;i<=n;i++)
        if(T[i]==nod)
        dfs(i,dist+1);
}


void dfs2(int nod, int t2,int lev)
{
    int i;
    T2[nod]=t2;
    Lev[nod]=lev;
    if(!lev%H) t2=nod;
    for(i=1;i<=n;i++)
        if(T[i]==nod) dfs2(i,t2,lev+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()
{
     freopen("lca.in","r",stdin);
    freopen("lca.out","wt",stdout);

    scanf("%d %d\n", &n, &m);

     int i;
    for(i=2;i<=n;++i) scanf("%d ",&T[i]);

    dfs(1,0);
    //sort(R+1,R+n+1);
    //H=R[n];
    //H=9;
    H=sqrt(ad);

   /* for(i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d %d\n",&x,&y);
        while(x!=y)
            if(R[x]>R[y]) x=T[x];
              else y=T[y];

        printf("%d\n",y);
    }*/

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




}