Cod sursa(job #2165216)

Utilizator nerelog25Radu Andrei Stefan nerelog25 Data 13 martie 2018 11:30:27
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>
#define nmax 1000001
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int n,i,m[2*nmax][20],l,lg,mn,nr,j,x,y,diff,use[nmax],poz[nmax],ni[2*nmax],eu[2*nmax],q;
void df(int i,int niv)
{
    int j,sz;
    eu[++nr]=i;
    ni[nr]=niv;
    if(!poz[i]) poz[i]=nr;
    use[i]=1;
    sz=v[i].size();
    for(j=0;j<sz;j++)
    if(!use[v[i][j]]) {df(v[i][j],niv+1);
        eu[++nr]=i;
    ni[nr]=niv;}
}
int main()
{
    f>>n>>q;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[i].push_back(x);
        v[x].push_back(i);
    }

    df(1,0);
    ni[1]=0;
    eu[nr++]=1;
    for(i=1;i<=nr;i++) m[i][0]=i;
   for(j=1;(1<<j)<=nr;j++)
        for(i=1;i<=nr-(1<<j)+1;i++)
        if(ni[m[i][j-1]]<ni[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i][j-1];
        else m[i][j]=m[i+(1<<(j-1))][j-1];
    for(i=1;i<=q;i++)
    {
        f>>x>>y;
        x=poz[x];
        y=poz[y];
        if(x>y) swap(x,y);
        l=y-x+1;
        l=log2(l);
        if(ni[m[x][l]]<ni[m[y-(1<<l)+1][l]]) g<<eu[m[x][l]]<<endl;
        else g<<eu[m[y-(1<<l)+1][l]]<<endl;
    }

    return 0;
}