Pagini recente » Profil CiureanuAlexandru | Cod sursa (job #1001656) | Cod sursa (job #739841) | Cod sursa (job #1676069) | Cod sursa (job #2753906)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int NMAX = 25000;
const int LGMAX = 20;
int n, m;
int M[LGMAX][NMAX];
int lg[NMAX];
void precalculare(){
lg[1]=0;
for (int i = 2; i <= n; i ++)
lg[i] = lg[i / 2] + 1; ///precalculare pentru logaritmi
for(int i = 1; (1 << i) <= n; i ++)
for(int j = 1; j <= n; j ++)
M[i][j] = M[i - 1][M[i - 1][j]];
}
int query(int poz, int rang){
int stramos = poz; /// plecam de la stramosul de rang 0 -> aceeasi persoana
while(rang){
int i = lg[rang]; /// i -> log2(rang) -> linia pe care ne uitam
int pow2 = 1 << i;
stramos = M[i][stramos];
rang -= pow2;
}
return stramos;
}
int main()
{
int x, y;
fin>>n>>m;
for(int i = 1; i <= n; i ++)
fin>>M[0][i];
precalculare();
for(int i = 1; i <= m; i ++){
fin>>x>>y;
fout<<query(x, y)<<"\n";
}
fin.close();
fout.close();
return 0;
}