Pagini recente » Cod sursa (job #3181014) | Cod sursa (job #1886962) | Cod sursa (job #369400) | Cod sursa (job #3222937) | Cod sursa (job #707728)
Cod sursa(job #707728)
#include <fstream>
#include <vector>
#define MAXN 100010
#define MAXK 1000010
using namespace std;
int log[MAXK],First[MAXN],k,rmq[MAXK][20],l[MAXK],euler[MAXK],n,m;
vector<int>v[100010];
void dfs(int x,int lev)
{
l[++k]=lev;
euler[k]=x;
First[x]=k;
for(int i=0;i<v[x].size();i++)
{
dfs(v[x][i],lev+1);
l[++k]=lev;
euler[k]=x;
}
}
void RMQ()
{
for(int i=1;i<=k;i++) rmq[i][0]=i;
for(int j=1;(1<<j)<=k;j++)
for(int i=1;i<=k and i+(1<<j)<=k;i++)
if(l[rmq[i][j-1]]<l[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1]; else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
int main()
{
int i,x,y,u,w;
ifstream fi("lca.in");
ofstream fo("lca.out");
fi>>n>>m;
for(i=1;i<n;i++)
{
fi>>x;
v[x].push_back(i+1);
}
dfs(1,1);
for(i=2;i<=k;i++) log[i]=log[i/2]+1;
RMQ();
for(i=1;i<=m;i++)
{
fi>>u>>w;
x=First[u]; y=First[w];
if(x>y) swap(x,y);
int dif=y-x+1;
int L=log[dif];
if(l[rmq[x][L]]<l[rmq[y-(1<<L)+1][L]]) fo<<euler[rmq[x][L]]<<"\n"; else
fo<<euler[rmq[y-(1<<L)+1][L]]<<"\n";
}
return 0;
}