Pagini recente » Cod sursa (job #380617) | Cod sursa (job #3205164) | Cod sursa (job #2062583) | Cod sursa (job #1797361) | Cod sursa (job #2503317)
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 100000
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, dist[NMAX+10][20], level[NMAX+10];
vector <int> fiu[NMAX+10];
void dfs(int nod, int tata)
{ level[nod] = level[tata] + 1;
for(int i=0; i<fiu[nod].size(); i++)
if(fiu[nod][i] != tata) dfs(fiu[nod][i], nod);
}
int lca(int x, int y)
{ if(level[x] < level[y]) swap(x, y);
int dif = level[x] - level[y];
for(int i=0; (1<<i)<=dif; i++) if(dif & (1 << i)) x = dist[x][i];
if(x == y) return x;
for(int i=18; i>=0; i--)
if(dist[x][i] && dist[y][i] && dist[x][i] != dist[y][i]) x = dist[x][i], y = dist[y][i];
return dist[x][0];
}
int main()
{
f >> n >> m;
for(int i=2; i<=n; i++)
{ f >> dist[i][0];
fiu[dist[i][0]].push_back(i);
}
dfs(1, 0);
for(int i=1; (1<<i)<=n; i++)
for(int j=1; j<=n; j++) dist[j][i] = dist[dist[j][i-1]][i-1];
for(int i=1; i<=m; i++)
{ int x, y;
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}