Cod sursa(job #792684)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 29 septembrie 2012 09:02:43
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#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;
}