Cod sursa(job #2113480)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 24 ianuarie 2018 17:01:39
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <math.h>
#include <vector>
#define nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int q[nmax*2][30],p[30],vf,l[nmax*2],ap[nmax],eu[nmax*2];
void euler(int i,int lev)
{

    for(int j=0;j<v[i].size();j++)
    {
        vf++;
        eu[vf]=v[i][j];
        ap[v[i][j]]=vf;
        l[vf]=lev+1;

        euler(v[i][j],lev+1);

        eu[++vf]=i;
        l[vf]=lev;
    }
}
int main()
{
    int n,m,i,j,x,y;
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    l[1]=0;
    ap[1]=1;
    eu[1]=1;
    vf=1;
    euler(1,0);
    p[0]=1;
    for(i=0;p[i]<=vf;i++)
        p[i+1]=p[i]*2;

    for(i=1;i<=vf;i++)
        q[i][0]=i;

    for(j=1;p[j]<=vf;j++)
        for(i=0;i+p[j-1]<=vf;i++)
        {
            q[i][j]=q[i][j-1];
            if(l[q[i][j-1]]>l[q[i+p[j-1]][j-1]])
                q[i][j]=q[i+p[j-1]][j-1];
        }
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        x=ap[x];
        y=ap[y];
        if(x>y)
            swap(x,y);
        for(j=0;p[j]<=y-x+1;j++);
        j--;
        if(j!=0)
        {
            if(l[q[x][j]]<l[q[y-p[j]+1][j]])
                g<<eu[q[x][j]];
            else
                g<<eu[q[y-p[j]+1][j]];
        }
        else
        {
            if(y-x==1)
                g<<eu[q[x][1]];
            else
                g<<eu[q[x][0]];
        }
        g<<'\n';
    }
    return 0;
}