Pagini recente » Cod sursa (job #605032) | Cod sursa (job #1599027) | Cod sursa (job #1707917) | Cod sursa (job #937797) | Cod sursa (job #2030512)
#include<bits/stdc++.h>
using namespace std;
const int nmax=1e5+5;
vector<int> gf[nmax];
int nivel[nmax];
int tata[nmax];
int sqrtH;
void dfs(int nod){
for(int i=0;i<gf[nod].size();i++){
int vecin=gf[nod][i];
tata[vecin]=nod;
nivel[vecin]=nivel[nod]+1;
dfs(vecin);
}
}
int tata2[nmax];
void dfsStramos(int nod,int stramos){
tata2[nod]=stramos;
if(nivel[nod]%sqrtH==0){
stramos=nod;
}
for(int i=0;i<gf[nod].size();i++){
int vecin=gf[nod][i];
dfsStramos(vecin,stramos);
}
}
int query(int x,int y){
while(tata2[x]!=tata2[y]){
if(nivel[x]>nivel[y]){
x=tata2[x];
}
else{
y=tata2[y];
}
}
//au ajuns in acelasi interval
//le aduc la acelasi nivel
if(nivel[x]<nivel[y]){
swap(x,y);
}
//x trebuie adus la nivelul lui y
while(nivel[x]!=nivel[y]){
x=tata[x];
}
//sunt la acelasi nivel le cautam tatal
while(x!=y){
x=tata[x];
y=tata[y];
}
return x;
}
int main(){
ifstream cin("lca.in");
ofstream fout("lca.out");
int n,m;
cin>>n>>m;
for(int i=2;i<=n;i++){
int x;
cin>>x;
gf[x].push_back(i);
}
nivel[1]=1;
dfs(1);
int h=0;
for(int i=1;i<=n;i++){
h=max(h,nivel[i]);
}
cout<<h<<"\n";
sqrtH=sqrt(h);
cout<<sqrtH<<"\n";
int stramos=0;
dfsStramos(1,stramos);
for(int i=1;i<=n;i++){
cout<<tata2[i]<<" ";
}
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
fout<<query(x,y)<<"\n";
}
}