Pagini recente » Cod sursa (job #2493629) | Cod sursa (job #1879340) | Cod sursa (job #496470) | Cod sursa (job #1296509) | Cod sursa (job #2180477)
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
int n,m,A[200005],M[200005][26],top,poz[100005];
vector <int> L[100002];
bool v[100005];
void RMQ()
{
int i,j=1,p;
for(j=1,p=2;p<top;j++,p*=2)
{
for(i=0;i+p-1<top;i++)
{
M[i][j]=min(M[i][j-1],M[i+p/2][j-1]);
}
}
}
void dfs(int nod)
{
v[nod]=true;
M[top++][0]=nod;
poz[nod]=top-1;
for(unsigned int i=0;i<L[nod].size();i++)
{
if(v[L[nod][i]]==false)
{
dfs(L[nod][i]);
M[top++][0]=nod;
}
}
}
void Afisare()
{
for(int i=0;i<top;i++)
{
for(int j=0;j<sqrt(top)+1;j++)
cout<<M[i][j]<<" ";
cout<<"\n";
}
}
int main()
{
int i,x,y,aux,k;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
L[i].push_back(x);
L[x].push_back(i);
}
dfs(1);
RMQ();
//Afisare();
//cout<<top;
for(i=0;i<m;i++)
{
fin>>x>>y;
if(x>y) swap(x,y);
aux=1;
k=0;
while(aux<=poz[y]-poz[x]+1)
{
k++;
aux*=2;
}
k--;
aux/=2;
//cout<<aux<<"\n";
fout<<min(M[poz[x]][k],M[poz[y]-aux+1][k])<<"\n";
}
//cout<<"\n\n"<<poz[2]<<" "<<poz[4];
fin.close();
fout.close();
return 0;
}