Pagini recente » Cod sursa (job #2057968) | Statistici Chiritescu Denie (DenisacheInfo) | Monitorul de evaluare | Cod sursa (job #693731) | Cod sursa (job #1217966)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int nmax = 100010;
int viz[nmax],niv[3*nmax],nivel[3*nmax],n,m,x,y,i,j,poz[nmax],rmq[3*nmax][20],lg[nmax*3];
vector<int> g[nmax],euler;
void dfs(int v)
{
viz[v]=1;
euler.push_back(v);
for (int i=0;i<g[v].size();i++)
if (!viz[g[v][i]])
{
niv[g[v][i]]=niv[v]+1;
dfs(g[v][i]);
euler.push_back(v);
}
}
int main()
{
cin>>n>>m;
for (i=2;i<=n;i++)
{
cin>>x;
g[x].push_back(i);
g[i].push_back(x);
}
dfs(1);
for (i=0;i<euler.size();i++) {
nivel[i]=niv[euler[i]];
poz[euler[i]]=i;
}
int len = euler.size();
for (i=0;i<len;i++) rmq[i][0]=i;
for (j=1;(1<<j)<=len;j++)
for (i=0;(i+(1<<j)-1)<len;i++)
if (nivel[rmq[i][j-1]]<nivel[rmq[i+ (1 << (j-1))][j-1]])
rmq[i][j]=rmq[i][j-1];
else rmq[i][j]=rmq[i+ (1<< (j-1))][j-1];
for (i=1;i<=m;i++)
{
int p,q;
cin>>p>>q;
x=poz[p]; y=poz[q];
int k=0;
while (1<<k <= y-x+1) k++; k--;
int ind;
if (nivel[rmq[x][k]]<nivel[rmq[y-( 1 << k) +1][k]]) ind=rmq[x][k]; else
ind = rmq[y - (1 << k) + 1][k];
cout<<euler[ind]<<"\n";
}
return 0;
}