Pagini recente » Cod sursa (job #726969) | Cod sursa (job #1903091) | Cod sursa (job #193802) | Cod sursa (job #1748541) | Cod sursa (job #579982)
Cod sursa(job #579982)
#include<fstream>
#include<vector>
#define Nmax 100001
#define lgMax 20
using namespace std;
int n,m,RMQ[lgMax][Nmax<<2],nr,loc[Nmax<<1],lg[Nmax<<1],L[Nmax<<1],H[Nmax<<1];
vector<int> G[Nmax];
void df(int nod,int lev)
{
H[++nr] = nod;
L[nr] = lev;
loc[nod] = nr;
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
{
df(*it,lev+1);
H[++nr] = nod;
L[nr] = lev;
}
}
void rmq()
{
int i,j;
for(i=1;i<=nr;++i)
RMQ[0][i] = i;
for(j=1;(1<<j)<=nr;++j)
for(i=1;i+(1<<j)-1<=nr;++i)
{
RMQ[j][i] = RMQ[j-1][i];
if(L[RMQ[j-1][i+1]]<L[RMQ[j][i]])
RMQ[j][i] = RMQ[j-1][i+1];
}
}
int querry(int x,int y)
{
int log = lg[y-x+1],sol;
sol = RMQ[log][x];
if(L[sol]>L[RMQ[log][y-(1<<log)+1]])
sol = RMQ[log][y-(1<<log)+1];
return H[sol];
}
int main()
{
ifstream f("lca.in");
f>>n>>m;
int i,p,q,x;
for(i=2;i<=n;++i)
{
f>>x;
G[x].push_back(i);
lg[i] = lg[i/2]+1;
}
df(1,1);
rmq();
ofstream g("lca.out");
while(m--)
{
f>>p>>q;
g<<querry(loc[p],loc[q])<<"\n";
}
f.close();
g.close();
return 0;
}