Pagini recente » Cod sursa (job #1994232) | Cod sursa (job #1394491) | Cod sursa (job #1808614) | Cod sursa (job #161663) | Cod sursa (job #1882292)
#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)//nodul,tatal lui si nivelul :-)
{
int i;
tata2[nod]=n1;//retin tatal
niv[nod]=Niv;//ii retin nivelul in arbore
if(Niv%h==0)
n1=nod;
for(i=0;i<ls[nod].size();i++)//fac aceleasi lucruri pentru toti fii nodului meu
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);//retin muchiile conform vectorului de tati
}
dfs(1,1,0);//formez vectorul pentru nivele
while(m)
{
f>>x>>y;//nodurile al caror stramos trebuie sa il afluu
while(tata2[x]!=tata2[y])//atata vreme cat nu am acelasi tata urc in arbore
if(niv[x]>niv[y])
x=tata2[x];
else
y=tata2[y];
while(x!=y)//stramosul comun retinut in x
if(niv[x]>niv[y])
x=tata[x];
else
y=tata[y];
g<<x<<"\n";
m--;
}
return 0;
}