Pagini recente » Cod sursa (job #126385) | Cod sursa (job #515633) | Cod sursa (job #618216) | Cod sursa (job #1129762) | Cod sursa (job #1382462)
#include <fstream>
#include <vector>
#define nmax 100005
using namespace std;
vector <int> a[nmax];
ifstream f("lca.in");
ofstream g("lca.out");
int v[19][nmax*4],k,log[nmax*4];
int n,m,niv[nmax],viz[nmax],prim[nmax];
void dfs(int x,int nivel)
{
int i,y;
v[0][++k]=x;
if (prim[x]==0)
prim[x]=k;
viz[x]=1;
niv[x]=nivel;
vector <int> ::iterator it=a[x].begin();
for (;it!=a[x].end();it++) {
y=*it;
if (viz[y]==0) {
dfs(y,nivel+1);
v[0][++k]=x;
if (prim[x]==0)
prim[x]=k;
}
}
}
int query(int x,int y)
{
if (x>y)
swap(x,y);
int l=(y-x+1);
int lg=log[l];
int a=v[lg][x],b=v[lg][y-(1<<lg)+1];
if (niv[a]<niv[b])
return a;
return b;
}
void rmq()
{
int i,j,x,y;
for (i=2;i<=k;i++)
log[i]=log[i/2]+1;
for (i=1;(1<<i)<=k;i++)
for (j=1;j+(1<<i)<=k;j++) {
x=v[i-1][j];
y=v[i-1][j+(1<<(i-1))];
if (niv[x]<niv[y])
v[i][j]=x;
else
v[i][j]=y;
}
}
int main()
{
int i,j,x,y;
f>>n>>m;
for (i=2;i<=n;i++) {
f>>x;
a[x].push_back(i);
}
dfs(1,0);
rmq();
for (i=1;i<=m;i++) {
f>>x>>y;
g<<query(prim[x],prim[y])<<'\n';
}
return 0;
}