Pagini recente » Cod sursa (job #982061) | Cod sursa (job #1051707) | Cod sursa (job #2909118) | Cod sursa (job #3228374) | Cod sursa (job #2771445)
#include <fstream>
using namespace std;
const int maxn=25*1e4+1;
const int putere=19;
ifstream cin ("stramosi.in");
ofstream cout ("stramosi.out");
int tati[maxn], n, m, stramosi[maxn][putere];//tinem stramosii de ordin 2 la k
int p, depth;
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
cin>>tati[i];
}
//precalculam stramosii
for(int j=0, lungime=1; lungime<=n; j++, lungime<<=1){
for(int i=1; i<=n; i++){
if(j==0){
stramosi[i][j]=tati[i];//pe cazul de baza, stramosul de grad 1 e tac'su
}
else{
stramosi[i][j]=stramosi[stramosi[i][j-1]][j-1];
//str[i][j-1] e stramos de ordin 2 la k, caruia ii calc stramosul de 2 la k
//ca sa obtin stramosul de ordin 2 la k+1
}
}
}
for(int i=0; i<m; i++){
cin>>p>>depth;
int bitReached=0, currNode=p;
while(depth!=0){//cat mai am biti in adancime
if(depth&1){//daca am bitul 1
currNode=stramosi[currNode][bitReached];//urc un nr egal de pasi cu bitul unde sunt
}
bitReached++;//avansez un bit
depth>>=1;//si, of course, shiftez
}
cout<<currNode<<"\n";
}
return 0;
}