Pagini recente » Istoria paginii utilizator/florin987 | Istoria paginii utilizator/vladfetitoiu_fmi_uvt | Profil LaurianAlexandru | Istoria paginii utilizator/smokerbank | Cod sursa (job #792684)
Cod sursa(job #792684)
#include<fstream>
using namespace std;
int n,Q;
int tata[250100],stramos[20][250100],put[250100];
//stramos[i][j]=al 2^i-lea stramos al lui j
//put[i]=(int)logaritm in baza 2 din i
inline void RMQ()
{
int i,j;
for(i=1;i<=n;i++)
stramos[0][i]=tata[i];
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
stramos[i][j]=stramos[i-1][stramos[i-1][j]];
}
inline int Stramos(int nod,int nr)
{
if(nod==0)
return 0;
if(nr==0)
return nod;
nod=stramos[put[nr]][nod];
nr-=(1<<put[nr]);
return Stramos(nod,nr);
}
int main()
{
int i,nod,nr;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
fin>>n>>Q;
for(i=1;i<=n;i++)
fin>>tata[i];
RMQ();
put[1]=0;
for(i=2;i<=n;i++)
put[i]=put[i/2]+1;
for(i=1;i<=Q;i++)
{
fin>>nod>>nr;
if(nr>n)
fout<<0<<"\n";
else
fout<<Stramos(nod,nr)<<"\n";
}
fin.close();
fout.close();
return 0;
}