Pagini recente » Borderou de evaluare (job #710880) | Borderou de evaluare (job #2770036) | Borderou de evaluare (job #2021593) | Borderou de evaluare (job #3136386) | Cod sursa (job #2858062)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <climits>
#include <unordered_map>
#define NMAX 100003
//Solutia cu cautare bruta din nod in nod
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int tata[NMAX],niv[NMAX];
vector<int>graf[NMAX];
void dfs(int nod,int nivel)
{
niv[nod]=nivel;
for(int i=0; i<graf[nod].size(); i++)
{
tata[graf[nod][i]]=nod;
dfs(graf[nod][i],nivel+1);
}
}
void lca(int x,int y)
{
int ans1=x;
int ans2=y;
while(niv[ans1]>niv[ans2])
{
ans1=tata[ans1];
}
while(niv[ans1]<niv[ans2])
{
ans2=tata[ans2];
}
while(ans1!=ans2)
{
ans1=tata[ans1];
ans2=tata[ans2];
}
fout<<ans1<<"\n";
}
int main()
{
fin >> n >> m;
for(int i=2; i<=n; i++)
{
int x;
fin>>x;
graf[x].push_back(i);
}
dfs(1,0);
for(int i=1; i<=m; i++)
{
int x,y;
fin>>x>>y;
lca(x,y);
}
return 0;
}