Pagini recente » Cod sursa (job #3168968) | Istoria paginii runda/usu9/clasament | Monitorul de evaluare | Cod sursa (job #1490046) | Cod sursa (job #1043269)
#include<fstream>
#include<vector>
#define N 1000100
#define logo 22
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,M,i,j,l,lg[N<<1],m[logo][N<<1],x,viz[N],s[N<<1],t,a,b,dif;
vector<int> v[N];
void dfs(int nod)
{
s[++t]=nod;
if(!viz[nod])
viz[nod]=t;
for(int i=0;i<v[nod].size();++i)
{
dfs(v[nod][i]);
s[++t]=nod;
}
}
int main ()
{
f>>n>>M;
for(i=2;i<=n;++i)
{
f>>x;
v[x].push_back(i);
}
dfs(1);
for(i=2;i<=t;++i)
lg[i]=lg[i>>1]+1;
for(i=1;i<=t;++i)
m[0][i]=s[i];
for(i=1;(1<<i)<=t;++i)
for(j=1;j<=t-(1<<i);++j)
{
l=1<<(i-1);
m[i][j]=min(m[i-1][j],m[i-1][j+l]);
}
for(i=1;i<=M;++i)
{
f>>a>>b;
a=viz[a]; b=viz[b];
if(a>b)swap(a,b);
dif=b-a+1;
l=lg[dif];
dif=dif-(1<<l);
g<<min(m[l][a],m[l][a+dif])<<"\n";
}
return 0;
}