Cod sursa(job #938956)

Utilizator enedumitruene dumitru enedumitru Data 14 aprilie 2013 16:57:02
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.75 kb
#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.
*/