Pagini recente » Cod sursa (job #1386011) | Cod sursa (job #18258) | Cod sursa (job #2789057) | Cod sursa (job #1327384) | Cod sursa (job #2389309)
#include <iostream>
#include <stdio.h>
#define FOR(i,a) for((i)=0;(1<<i)<=a;++i)
using namespace std;
FILE *f,*g;
int RMQ[250010][25];///RMQ[i][j]-reține al 2^j strămoș al nodului i
///folosim ideea că orice număr natural se poate scrie ca sumă de puteri distince ale lui 2, ca atare:
/// E = { 2^w + 2^t + 2^z + .... + 2^q },w,t,z,...q distincte și w < t < z < ... < q
int N,M;
void Read()
{
int i;
fscanf(f,"%d %d",&N,&M);
for(i=1;i<=N;++i)fscanf(f,"%d",&RMQ[i][0]);
}
void BuildMatrix()///* Dynamic Programming and "Some Math For Babies :-) " by Marius Buzg
{
int i,j,X;
for(i=1;i<=18;++i)
for(j=1;j<=N;++j)
{
X=RMQ[j][i-1];
RMQ[j][i]=RMQ[X][i-1];
}
}
int Search(int Node,int P)
{
int i;
FOR(i,P)
{
if(P&(1<<i))/// (1<<i) aparține lui E
{
Node=RMQ[Node][i];
if(!Node)return 0;
}
}
return Node;
}
void SolveAndDisplaying()
{
int X,Poz;
while(M)
{
--M;
fscanf(f,"%d %d",&X,&Poz);
fprintf(g,"%d\n",Search(X,Poz));
}
}
int main()
{
f=fopen("stramosi.in","r");g=fopen("stramosi.out","w");
Read();BuildMatrix();SolveAndDisplaying();
fclose(f);fclose(g);
return 0;
}