Pagini recente » Cod sursa (job #1577815) | Cod sursa (job #3248434) | Cod sursa (job #2504741) | Cod sursa (job #2960551) | Cod sursa (job #2523461)
#include <fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct {int val;int ind;} rmq[300005][30];
int doi[300005],nr,d[300005],first[300005],v[300005];
vector <int> G[200005];
void dfs(int nod);
int main()
{
int n,i,m,j,x,y;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
G[x].push_back(i);
}
d[0]=-1;
dfs(1);
for(i=1;i<=nr;i++)
if(!first[v[i]])
first[v[i]]=i;
for(i=1;i<=nr;i++) {rmq[i][0].val=d[v[i]]; rmq[i][0].ind=v[i];}
//RMQ
for(i=2;i<=nr;i++)
doi[i]=doi[i/2]+1;
for(j=1;j<=doi[nr];j++) //lungimi
for(i=1;i<=nr;i++) //inceput
if(rmq[i][j-1].val<=rmq[i+(1<<(j-1))][j-1].val) rmq[i][j].val=rmq[i][j-1].val, rmq[i][j].ind=rmq[i][j-1].ind;
else rmq[i][j].val=rmq[i+(1<<(j-1))][j-1].val, rmq[i][j].ind=rmq[i+(1<<(j-1))][j-1].ind;
for(i=1;i<=m;i++)
{
fin>>x>>y;
x=first[x];
y=first[y];
if(x>y) swap(x,y);
if(rmq[x][doi[y-x]].val <= rmq[y-(1<<doi[y-x])+1][doi[y-x]].val)
fout<< rmq[x][doi[y-x]].ind;
else fout<<rmq[y-(1<<doi[y-x])+1][doi[y-x]].ind;
fout<<'\n';
}
return 0;
}
void dfs(int nod)
{
v[++nr]=nod;
for(int i=0;i<G[nod].size();i++)
{
d[G[nod][i]]=d[nod]+1;
dfs(G[nod][i]);
v[++nr]=nod;
}
}