Pagini recente » Cod sursa (job #402758) | Cod sursa (job #1362542) | Cod sursa (job #383402) | Cod sursa (job #2809035) | Cod sursa (job #579943)
Cod sursa(job #579943)
#include<fstream>
#include<vector>
#define Nmax 100001
#define lgMax 20
using namespace std;
int n,m,euler[lgMax][2*Nmax],nr,loc[Nmax],lg[Nmax];
vector<int> G[Nmax];
void df(int nod)
{
++nr;
euler[0][nr] = nod;
loc[nod] = nr;
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
{
df(*it);
euler[0][++nr] = nod;
}
}
void rmq()
{
int i,j,put;
for(j=1;(1<<j)<=nr;++j)
{
put = 1<<j;
for(i=1;i+put-1<=nr;++i)
euler[j][i] = min(euler[j-1][i], euler[j-1][i+put/2]);
}
}
int querry(int x,int y)
{
int log = lg[y-x+1];
return min(euler[log][x], euler[log][y-(1<<log)+1]);
}
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);
rmq();
ofstream g("lca.out");
while(m--)
{
f>>p>>q;
g<<querry(loc[p],loc[q])<<"\n";
}
f.close();
g.close();
return 0;
}