Pagini recente » Cod sursa (job #1065953) | Cod sursa (job #1617465) | Cod sursa (job #2137256) | Cod sursa (job #991293) | Cod sursa (job #2225275)
#include<fstream>
#include<vector>
using namespace std;
int n, m, f[100005], log[200005];
vector<int> g[100005], euler, lev;
int **rmq;
void dfs(int nod, int l) {
euler.push_back(nod);
lev.push_back(l);
f[nod]=euler.size()-1;
for (int i=0; i<g[nod].size(); ++i) {
dfs(g[nod][i],l+1);
euler.push_back(nod);
lev.push_back(l);
}
}
int main(void) {
ifstream cin("lca.in");
ofstream cout("lca.out");
log[1]=0;
for (int i=2; i<=200001; ++i) log[i]=log[i/2]+1;
cin>>n>>m;
for (int i=2; i<=n; ++i) {
int x;
cin>>x;
g[x].push_back(i);
}
dfs(1,1);
int vs = euler.size();
rmq = new int*[log[vs]+1];
for (int i=0; i<=log[vs]; ++i) rmq[i]=new int[vs];
for (int i=0; i<vs; ++i) rmq[0][i]=i;
for (int i=1; i<=log[vs]; ++i)
for (int j=0; j<=vs-(1<<i); ++j)
if (lev[rmq[i-1][j]]<lev[rmq[i-1][j+(1<<(i-1))]]) rmq[i][j]=rmq[i-1][j];
else rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
for (int i=1; i<=m; ++i) {
int x, y; cin>>x>>y;
int l=min(f[x],f[y]);
int r=max(f[x],f[y]);
int idx=log[r-l+1];
int d = (1<<idx);
if (lev[rmq[idx][l]]<lev[rmq[idx][r-d+1]]) cout<<euler[rmq[idx][l]]<<"\n";
else cout<<euler[rmq[idx][r-d+1]]<<"\n";
}
return 0;
}