Pagini recente » Cod sursa (job #2553899) | Cod sursa (job #2860802) | Cod sursa (job #1432557) | Cod sursa (job #596863) | Cod sursa (job #2393141)
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,nrc=1;
vector < int> g[NMAX];
int ap[2*NMAX];
int level[2*NMAX];
int euler[NMAX*2];
bool uz[2*NMAX];
int rmql[2*NMAX-1][20];
void dfs(int k,int lvl);
void citire();
int main()
{citire();
return 0;
}
void citire()
{int x,ant,i,j,y;
fin>>n>>m;
ant=0;
for(i=2;i<=n;i++)
{
fin>>x;
g[x].push_back(i);
g[i].push_back(x);
}
dfs(1,0);
//for(i=1;i<=nrc;i++)
// fout<<euler[i]<<" ";
//fout<<'\n';
for(i=1;i<=2*n-1;i++)
rmql[i][0]=euler[i];
for(j=1; (1<<j) <=i;j++)
for(i=1;i<=2*n-1;i++)
{ if( level[ rmql[i][j-1] ] < level[ rmql[i-(1<<(j-1) ) ][j-1] ] )
rmql[i][j]=rmql[i][j-1];
else
rmql[i][j]=rmql[i-(1<<(j-1) )][j-1];
}
//for(i=1;i<=2*n-1;i++)
//fout<<rmql[i][1]<<" ";
for(int ct=1;ct<=m;ct++)
{
fin>>x>>y;
//if(x==y)
// fout<<x<<'\n';
// else
i=min(ap[x],ap[y]);
j=max(ap[y],ap[x]);
int k=log2(j-i+1);
if(level[rmql[j ][k]]<level[rmql[i+(1<<k)-1][k]] )
fout<<rmql[j][k]<<'\n';
else
fout<<rmql[i+(1<<k)-1][k]<<'\n';
}
}
void dfs(int k,int lvl)
{
int i;
uz[k]=1;
if(!ap[k] && k!=1)
ap[k]=nrc;
level[k]=lvl;
euler[nrc]=k;
for(i=0;i<g[k].size();i++)
if(!uz[g[k][i]])
{
nrc++;
dfs(g[k][i],lvl+1);
if(g[k].size()>1)///inseamna ca am revenit
nrc++, euler[nrc]=k;
}
}