Mai intai trebuie sa te autentifici.
Cod sursa(job #2172783)
Utilizator | Data | 15 martie 2018 17:52:07 | |
---|---|---|---|
Problema | Lowest Common Ancestor | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.1 kb |
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100005];
int dp[100005][25],n,lvl[100005];
void update()
{
int j,i;
for(j=1;j<=20;j++)
for(i=2;i<=n;i++)
dp[i][j]=dp[dp[i][j-1]][j-1];
}
void DFS(int x)
{
for(int i=0;i<v[x].size();i++)
{
lvl[v[x][i]]=lvl[x]+1;
DFS(v[x][i]);
}
}
int querry(int x,int y)
{
int i;
if(lvl[y]>lvl[x])
swap(x,y);
//lvl[x]>lvl[y];
// egalez nivelele
for(i=20;i>=0;i--)
if(lvl[dp[x][i]]>=lvl[y])
x=dp[x][i];
if(x==y)
return x;
for(i=20;i>=0;i--)
if(dp[x][i]!=dp[y][i])
{
x=dp[x][i];
y=dp[y][i];
}
return dp[x][0];
}
int main()
{
int i,m,x,y;
ios::sync_with_stdio(false);
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>dp[i][0];
v[dp[i][0]].push_back(i);
}
lvl[1]=1;
DFS(1);
update();
for(i=1;i<=m;i++)
{
f>>x>>y;
g<<querry(x,y)<<'\n';
}
}