Pagini recente » Cod sursa (job #486930) | Cod sursa (job #100595) | Cod sursa (job #1142669) | Cod sursa (job #1682258) | Cod sursa (job #1328072)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <map>
#include <vector>
#define punct pair<long long int,long long int>
#define x first
#define y second
#define eps 0.00000000000000001
#define MOD 1000000007
using namespace std;
int n,m;
vector<int> v[200001],euler;
int rmq[18][600005],lg,fv[200001],doi[600001],pos[600001],i,j,a,x,y;
void df(int i)
{
++fv[i];
euler.push_back(i);
for (int j=0;j<v[i].size();++j)
{
if (!fv[v[i][j]])
++fv[v[i][j]],df(v[i][j]);
euler.push_back(i);
}
}
ifstream f("lca.in");
ofstream g("lca.out");
int main()
{
ios_base::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
ifstream cin(".in");
ofstream cout(".out");
#endif
f>>n>>m;
for (i=1;i<n;++i)
{
f>>a;
v[a].push_back(i+1);
}
df(1);
for(i=0;i<euler.size();++i)
rmq[0][i]=euler[i];
for(i=0;i<euler.size();++i)
if (!pos[euler[i]])
pos[euler[i]]=i;
n=euler.size();
int ct=0;
for (i=0;i<=n;++i)
{
if (1<<(ct+1)<=i)
++ct;
doi[i]=ct;
}
for (i=1;i<=17;++i)
for (j=1;j<=n-(1<<(i-1))+1;++j)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
//for (i=0;i<=10;++i,g<<'\n')
// for (j=1;j<=30;++j)
// g<<rmq[i][j]<<" ";
while(m--)
{
f>>x>>y;
lg=doi[pos[y]-pos[x]];
g<<min(rmq[lg][pos[x]],rmq[lg][pos[y]-(1<<lg)+1])<<'\n';
}
return 0;
}