Pagini recente » Cod sursa (job #2190805) | Cod sursa (job #2921188) | Cod sursa (job #242697) | Cod sursa (job #2632100) | Cod sursa (job #381301)
Cod sursa(job #381301)
#include<fstream>
#define inf "stramosi.in"
#define outf "stramosi.out"
#define NMax 250001
using namespace std;
fstream f(inf,ios::in),g(outf,ios::out);
int N,M;
int v[NMax];
int lg[NMax];
int a[20][NMax]; // a[k][i] al 2^k-lea stramos al lui i
void Rezolva()
{
for(int i=1;i<=N;i++)a[0][i]=v[i];
for(int k=1; (1<<k) <=N ; k++ )
for(int i=1;i<=N;i++)a[k][i]=a[k-1][ a[k-1][i] ];
}
int RaspundeQuery(int q,int p)
{
int nod=q;
int k;
while(p>0)
{
k=lg[p];
nod=a[k][nod];
p-=(1<<k);
}
return nod;
}
void Citire()
{
int q,p;
//Citesc N,M,v
f>>N>>M;
for(int i=1;i<=N;i++)f>>v[i];
//Calculez cel mai mare k a.i. 2^k<=i
lg[1]=0;
for(int i=2;i<=N;i++)lg[i]=lg[i/2]+1;
//Rezolv folosind RMQ
Rezolva();
//Raspund la Query
for(int i=1;i<=M;i++)
{
f>>q>>p;
g<<RaspundeQuery(q,p)<<"\n";
}
}
int main()
{
Citire();
f.close();
g.close();
return 0;
}