Pagini recente » Cod sursa (job #1296887) | Cod sursa (job #1071331) | Cod sursa (job #750565) | Cod sursa (job #1120009) | Cod sursa (job #2073062)
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int> first,pe;
vector<vector<int> >la;
int RMQ[200005][20];
void dfs(int nod)
{
first[nod]=pe.size();
pe.push_back(nod);unsigned int i;
for(i=0;i<la[nod].size();++i)
{
dfs(la[nod][i]);
pe.push_back(nod);
}
}
void ConstruiesteRMQ()
{
unsigned int putere=2,exp=1;unsigned int i;
for(i=0;i<pe.size();++i) RMQ[i][0]=pe[i];
while(putere<=pe.size())
{
for(i=0;i+putere-1<pe.size();++i) RMQ[i][exp]=min(RMQ[i][exp-1],RMQ[i+putere/2][exp-1]);
putere<<=1;exp++;
}
}
int rmq(int st,int dr)
{
if(st>dr) st^=dr^=st^=dr;
int lungime=dr-st+1;
int lg=1,exp=0;
while(lg<=lungime) lg<<=1,++exp;
lg>>=1,--exp;
return min(RMQ[st][exp],RMQ[st+lungime-lg][exp]);
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,i,x,y;
f>>n>>m;la.resize(n);
for(i=1;i<n;++i) {f>>x;la[x-1].push_back(i);}
first.resize(n);
dfs(0);
la.clear();
ConstruiesteRMQ();
for(i=0;i<m;++i)
{
f>>x>>y;x--;y--;
int result=rmq(first[x],first[y])+1;
g<<result<<'\n';
}
return 0;
}