Pagini recente » Cod sursa (job #1121095) | Cod sursa (job #1505907) | Cod sursa (job #2791200) | Cod sursa (job #1161602) | Cod sursa (job #2478267)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int j,m,n,i,x,y;
int dp[20][200005];
long long pow;
vector <int> e;
struct snod
{
int par;
vector <int> cop;
} nod[100005];
void euler(int poz)
{
e.push_back(poz);
for(auto c : nod[poz].cop)
{
euler(c);
e.push_back(poz);
}
}
int qu(int x, int y)
{
int pow=1,i=1;
while(pow*2<=y-x+1)
{
i++;
pow*=2;
}
if(pow==y-x+1)
return dp[i][x];
return min(dp[i][x], dp[i][y-pow+1]);
}
int main()
{
fin>>n>>m;
for(i=2; i<=n; i++)
{
fin>>x;
nod[i].par=x;
nod[x].cop.push_back(i);
}
euler(1);
n=e.size()-1;
pow=1;
for(i=1;pow<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==1)
dp[i][j]=e[j];
else
{
if(j+pow/2<=n)
dp[i][j]=min(dp[i-1][j],dp[i-1][j+pow/2]);
else
dp[i][j]=dp[i-1][j];
}
}
pow*=2;
}
while(m)
{
fin>>x>>y;
for(i=0;i<=n;i++)
if(e[i]==x)
break;
for(j=0;j<=n;j++)
if(e[j]==y)
break;
if(i>j)
swap(i,j);
fout<<qu(i,j)<<'\n';
m--;
}
/*
while(m)
{
m--;
fin>>x>>y;
for(i=0;i<e.size();i++)
if(e[i]==x)
break;
for(j=0;j<e.size();j++)
if(e[j]==y)
break;
int mini=e[i];
if(i>j)
swap(i,j);
for(int it=i;it<=j;it++)
mini=min(mini, e[it]);
fout<<mini<<'\n';
}
*/
return 0;
}