Pagini recente » Cod sursa (job #1374225) | Cod sursa (job #1635612) | Cod sursa (job #1049929) | Cod sursa (job #2546940) | Cod sursa (job #2389320)
#include <bits/stdc++.h>
#define FOR(i,a) for((i)=0;(1<<i)<=a;++i)
using namespace std;
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;
ifstream f("stramosi.in");ofstream g("stramosi.out");
void Read()
{
int i;
f>>N>>M;
for(i=1;i<=N;++i)f>>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)
{
RMQ[j][i]=RMQ[RMQ[j][i-1]][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;
f>>X>>Poz;
g<<Search(X,Poz)<<"\n";
}
}
int main()
{
Read();BuildMatrix();SolveAndDisplaying();
f.close();g.close();
return 0;
}