Pagini recente » Cod sursa (job #2080043) | Cod sursa (job #584446) | Cod sursa (job #2211440) | Cod sursa (job #3177580) | Cod sursa (job #2488229)
#include <bits/stdc++.h>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int n,m,i,stramos,t,query,pas,k,tata[250100],d[20][250100];
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>tata[i];
d[0][i]=tata[i]; // 2^0=1 => stramosul direct
}
// acum facem dinamica. d[k][i] = al 2^k - lea stramos al lui i (d[k][i] = 0, daca nu exista un astfel de stramos)
for(k=1;(1<<k)<=n;k++)
{
for(i=1;i<=n;i++)
{
d[k][i] = d[k-1][d[k-1][i]]; // d[k][i] = al 2^(k-1) - lea stramos al lui X, unde X este al 2^(k-1) - lea stramos al lui i. (2^(k-1) + 2^(k-1) = 2^k)
}
}
for(query=1;query<=m;query++)
{
f>>i>>t;
stramos=i;
// descompunem pe t in puteri ale lui 2
pas=0;
while(t)
{
if(t%2==1) // am gasit o putere a lui 2
{
// merg in spate cu 2^(pas) stramsoi, si "reactualizez" nodul pt care mai fac restul stramosilor ramasi
stramos=d[pas][stramos];
}
pas++;
t=t/2;
}
g<<stramos<<'\n';
}
return 0;
}