Pagini recente » Cod sursa (job #482695) | Cod sursa (job #1176718) | Cod sursa (job #2362565) | Cod sursa (job #2747843) | Cod sursa (job #1734871)
#include<fstream>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int h=200;
int tata[100005],tata2[100005];
int niv[100005],x,y,m,n,i;
vector<int>ls[100005];
void dfs(int nod,int n1,int Niv)
{
int i;
tata2[nod]=n1;
niv[nod]=Niv;
if(Niv%h==0)
n1=nod;
for(i=0;i<ls[nod].size();i++)
dfs(ls[nod][i],n1,Niv+1);
}
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>tata[i];
ls[tata[i]].push_back(i);
}
df(1,1,0);
while(m)
{
f>>x>>y;
while(tata2[x]!=tata2[y])
if(niv[x]>niv[y])
x=tata2[x];
else
y=tata2[y];
while(x!=y)
if(niv[x]>niv[y])
x=tata[x];
else
y=tata[y];
g<<x<<"\n";
m--;
}
return 0;
}