Pagini recente » Cod sursa (job #3225475) | Cod sursa (job #813542) | Cod sursa (job #919330) | Cod sursa (job #1562326) | Cod sursa (job #2753169)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n,m;
int stramosi[20][250003];
void Prep()
{
//stramosi[i][j]= stramosul de ordin 2^i al elementului de pe poz j
for(int i=1, range=2; range<=n; ++i, range*=2) //range=2^i
for(int j=1; j<=n; ++j)
//stramosul de ordin P al unui element X este stramosul de ordin P/2 al stramosului de ordin P/2 al lui X
stramosi[i][j]=stramosi[i-1][stramosi[i-1][j]];
}
int stramos(int poz, int nrstram)
{
int powmax,temp,index;
temp=poz; //plec de la pozitia data
//simulez scrierea in baza 2 pentru numarul de stramosi pe care trebuie sa l parcurg
while(nrstram!=0)
{
powmax=1, index=0;
//caut cea mai mare putere a lui 2 mai mica sau egala decat nrstram
while(powmax*2<=nrstram)
powmax*=2,index ++;
temp=stramosi[index][temp]; //valoare temporara
nrstram-=powmax; //scad cati am putut sa parcurg
}
return temp;
}
int main()
{
int q,p;
fin>>n>>m;
for(int j=1; j<=n; ++j)
fin>>stramosi[0][j]; //prima linie e vectorul de stramosi
Prep(); //preprocesare
for(int i=1; i<=m; ++i)
{
fin>>q>>p; //al p lea stramos al numarul de pe pozitia q
fout<<stramos(q,p)<<"\n";
}
return 0;
}