Cod sursa(job #1607326)

Utilizator Darius15Darius Pop Darius15 Data 20 februarie 2016 23:37:19
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,j,x,first[100001],dif,ans,l,y,niv[200001],i,v[200001],val[200001][20],lg[200001];
bitset <100001> viz;
vector <int> fi[100001];
void dfs(int x,int lev)
{
  int j=0;
    v[++l]=x;
    niv[l]=lev;
    viz[x]=true;
    first[x]=l;
    for (j=0;j<fi[x].size();j++)
      if (viz[fi[x][j]]==false)
        dfs(fi[x][j],lev+1),v[++l]=x,niv[l]=lev;
}
int main()
{
    f>>n>>m;
    for (i=2;i<=n;i++)
    {
      f>>x;
      fi[x].push_back(i);
    }
    dfs(1,0);
    for (i=1;i<=l;i++)
     val[i][0]=i;
    for (i=1;(1<<i)<=l;i++)
        for (j=1;j+(1<<i)<=l;j++)
    {
      val[j][i]=val[j][i-1];
      if (niv[val[j][i]]>niv[val[j+(1<<(i-1))][i-1]])
         val[j][i]=val[j+(1<<(i-1))][i-1];
    }
    for (i=2;i<=l;i++)
      lg[i]=lg[i/2]+1;
    for (i=1;i<=m;i++)
    {
      f>>x>>y;
      x=first[x],y=first[y];
      if (x>y) swap(x,y);
      dif=y-x+1;
      dif=lg[dif];
      ans=val[x][dif];
      if (niv[val[y+1-(1<<dif)][dif]]<ans)
        ans=val[y+1-(1<<dif)][dif];
      g<<v[ans]<<'\n';
    }
    return 0;
}