Pagini recente » Cod sursa (job #139955) | Cod sursa (job #2257471) | Cod sursa (job #652970) | Istoria paginii runda/oji_go_10 | Cod sursa (job #999457)
Cod sursa(job #999457)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M;
vector <int> G[100002];
bool Use[100002];
int Euler[1000002],ind,First[100002],Level[100002<<1],counter;
int minimum_result[20][100002<<2],log[100002<<1];
int level;
void Calculate_log2()
{
int i=2,next=2;
while(i<=ind)
{
if(i!=next)
log[i]=log[i-1];
else
{
log[i]=log[i-1]+1;
next=i*2;
}
i++;
}
}
void Build_matrichs()
{
int i,j,forward=1;
for(i=1;i<=log[ind];i++)
{
for(j=1;j<=ind-(1<<i)+1;j++)
{
if(Level[minimum_result[i-1][j]]<Level[minimum_result[i-1][j+forward]])
minimum_result[i][j]=minimum_result[i-1][j];
else
minimum_result[i][j]=minimum_result[i-1][j+forward];
}
forward*=2;
}
}
void RMQ(int x,int y)
{
int i;
int how_much=log[y-x+1];
if(log[y-x]==how_much-1)
g<<minimum_result[log[y-x+1]][x]<<"\n";
else
{
if(Level[minimum_result[how_much][x]]<Level[minimum_result[how_much][y-(1<<how_much)+1]])
g<<minimum_result[how_much][x]<<"\n";
else
g<<minimum_result[how_much][y-(1<<how_much)+1]<<"\n";
}
}
void Read()
{
f>>N>>M;
for(int i=1;i<=N-1;i++)
{
int value;
f>>value;
G[value].push_back(i+1);
}
}
void DFS(int nod)
{
Euler[++ind]=nod;
if(Use[nod]==0)
First[nod]=ind,counter++;
Use[nod]=1;
Level[nod]=level;
level++;
for(unsigned int i=0;i<G[nod].size();i++)
{
int vecin=G[nod][i];
if(Use[vecin]==0)
{
DFS(vecin);
if(counter<N)
Euler[++ind]=nod;
}
}
level--;
}
void Browse()
{
int i;
for(i=1;i<=M;i++)
{
int x,y;
f>>x>>y;
RMQ(First[x],First[y]);
}
}
int main()
{
Read();
DFS(1);
for(int i=1;i<=ind;i++)
minimum_result[0][i]=Euler[i];
Calculate_log2();
Build_matrichs();
Browse();
return 0;
}