Pagini recente » Cod sursa (job #434665) | Cod sursa (job #850334) | Cod sursa (job #181908) | Cod sursa (job #107298) | Cod sursa (job #2939888)
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 250001
using namespace std;
ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
int n,q;
int dp[NMAX][23];//dp[nod][putere]->stramosul 2^putere al nodului nod
int stramos(int nod,int nrS)
{
//practic vad ce putere a lui 2 apare in nrS si ma duc acolo
//descompun numarul nrS in sume de puteri de 2(in baza 2)
int rez=nod;
for(int i=18; i>=0; i--)
{
if(nrS>=(1<<i))
{
nrS-=(1<<i);
rez=dp[rez][i];//ma duc in stramosul 2^i al nodului rezultat
}
}
return rez;
}
int main()
{
fin>>n>>q;
for(int i=1; i<=n; i++)
{
fin>>dp[i][0];
}
for(int k=1; (1<<k)<=n; k++)
{
//calculez al k vecin al nodului
for(int i=1; i<=n; i++)
{
dp[i][k]=dp[dp[i][k-1]][k-1];
//practic este stramosul 2^(k-1) al stramosului 2^(k-1) din i
//ca 2^(k-1)+2^(k-1)=2^k
}
}
for(int i=1; i<=q; i++)
{
int nod,nrS;
fin>>nod>>nrS;
fout<<stramos(nod,nrS)<<"\n";
}
return 0;
}