Pagini recente » Cod sursa (job #929135) | Cod sursa (job #3202810) | Cod sursa (job #388902) | Cod sursa (job #123682) | Cod sursa (job #2807152)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,q,t[100005],eu[200005],fs[100005],niv[100005],lg[200005],i,j,x,y;
pair<int,int> rmq[25][200005];
vector <int> v[100005];
void dfs(int nod,int ni)
{
eu[++eu[0]]=nod;
fs[nod]=eu[0];
niv[nod]=ni;
rmq[0][eu[0]].second=nod;
rmq[0][eu[0]].first=ni;
for (int i=0;i<v[nod].size();++i)
{
dfs(v[nod][i],ni+1);
eu[++eu[0]]=nod;
rmq[0][eu[0]].second=nod;
rmq[0][eu[0]].first=ni;
}
}
pair<int,int> rm(int x,int y)
{
int z=lg[y-x+1];
return min(rmq[z][x],rmq[z][y-(1<<z)+1]);
}
int main()
{
in>>n>>q;
for (i=2;i<=n;++i)
{
in>>t[i];
v[t[i]].push_back(i);
}
dfs(1,1);
lg[1]=0;
for (i=2;i<2*n;++i)
lg[i]=lg[i/2]+1;
for (i=1;i<=lg[2*n-1]+2;++i)
{
for (j=1;j+(1<<i)-1<=2*n-1;++j)
{
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
}
for (i=1;i<=q;++i)
{
in>>x>>y;
out<<rm(min(fs[x],fs[y]),max(fs[x],fs[y])).second<<'\n';
}
return 0;
}