Pagini recente » Cod sursa (job #961786) | Cod sursa (job #951227) | Cod sursa (job #1526770) | Cod sursa (job #161177) | Cod sursa (job #938956)
Cod sursa(job #938956)
#include <fstream>
using namespace std;
ifstream f("stramosi.in"); ofstream g("stramosi.out");
const int Nmax=(1<<18);
int n,m,q,p,j;
int b[19][Nmax],lg[Nmax];
int stram(int i, int j)
{ int ii=lg[i];
if(ii==0) return b[0][j];
int k=stram(ii,j);
if(k==0) return 0;
return stram(i-1,k);
}
int main()
{ f>>n>>m;
for(int r=1;r<=n;++r) f>>b[0][r];
for(int r=2;r<=n;++r) lg[r]=lg[r/2]+1; // precalculam log i pentru a il putea accesa ulterior in O(1)
while(m--)
{ f>>q>>p;
if(p>n) g<<"0\n";
else g<<stram(p,q)<<'\n';
}
g.close(); return 0;
}
/*
Trebuie sa ai ceva de genu b[ i ][ j ] = b[ i-1 ][ b[ i-1 ][ j ] ].
Iei al 2^(i-1)-lea parinte al celui de al 2^(i-1)-lea parinte al lui j adica al 2^i-lea parinte al lui j.
*/