Pagini recente » Cod sursa (job #654024) | Istoria paginii utilizator/mgpaduraru | Cod sursa (job #488850) | Cod sursa (job #811237) | Cod sursa (job #2753367)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, m;
int a[20][250003]; ///stramos[2^i][j]-->stramosul de ordin 2^i a elem de pe j
///RMQ
void initializare()
{
int i, j, p;
for(j = 1; j <=n; ++j)
a[i][j] = a[i-1][a[i-1][j]];///stramosul de orin p pt un elem este stramos de oridn p /2 pt stramos de oridn p/2
}
int calc(int poz, int nr) //al nr lea stramos pt elem pe poz poz
{
int pow, i, aux;
aux = poz;///plec de unde mi-a dat si vad unde ajung
///ca sa stim pentru ce elem facem ierarhia
while(nr != 0)//cat inca n am gasit stramosul
{
///mergem din puteri de a lui 2 cat de mult putem --> cautam cea mai apropiata de nr
pow = 1;
i = 0;
while(pow * 2 <= nr)
{
pow *= 2;
i++;
}
aux = a[i][aux]; ///devine noul copil pt care cautam stramosii
///copilul de orind 2^i pt aux;
nr -= pow;///de cati stramosi am scapat
}
return aux;
}
int main()
{
int x, y, i, j;
fin >> n >> m;
for(j = 1; j <= n; ++j)
fin>>a[0][j]; //primii stramosi(prima lin din matrice)
initializare();
for( i = 1; i <= m; ++i)
{
fin >> x >> y; //al y lea stramos pt elem pe poz x
fout << calc(x, y) << "\n";
}
}