Pagini recente » Cod sursa (job #1813571) | Cod sursa (job #3232535) | Cod sursa (job #3142683) | Cod sursa (job #2506801) | Cod sursa (job #887392)
Cod sursa(job #887392)
#include<fstream>
#include<vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m,i,j,x,nr,y,k,b[30][200005];
vector<int> sol,a[100005],first(100005),log(200005);
void euler(int nod)
{
if (!first[nod]) first[nod]=sol.size();
sol.push_back(nod);
for (vector<int>::iterator it=a[nod].begin();it!=a[nod].end();it++)
{
euler(*it);
sol.push_back(nod);
}
}
void rmq()
{
log[1]=0;
nr=sol.size();
for (i=1;i<=nr;i++) b[0][i]=sol[i];
for (i=2;i<=nr;i++)
log[i]=log[i/2]+1;
for (i=1;i<=log[nr];i++)
for (j=1;j<=nr-(1<<i)+1;j++)
b[i][j]=min(b[i-1][j],b[i-1][j+(1<<(i-1))]);
for (i=1;i<=m;i++)
{
in>>x>>y;
x=first[x];
y=first[y];
if (x>y) swap(x,y);
k=log[y-x+1];
out<<min(b[k][x],b[k][y-(1<<k)+1])<<'\n';
}
}
int main()
{
in>>n>>m;
for (i=2;i<=n;i++)
{
in>>x;
a[x].push_back(i);
}
sol.push_back(0);
euler(1);
rmq();
}