Pagini recente » Rating marele bastan (barosanul) | Cod sursa (job #593525) | Cod sursa (job #3247278)
#include <bits/stdc++.h>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int maxp2=20, nmax=250005;
int v[nmax], stramos[maxp2][nmax];//stramos[i][j] -> stramosul 2^i al nodului j
int n, m;
void PrecalculateAncestors()
{
for(int i=1; i<maxp2; i++)
{
for(int j=1; j<=n; j++)
{
stramos[i][j]=stramos[i-1][stramos[i-1][j]];//impart intervalul in 2^(i-1) de 2 ori
}
}
}
int FindAncestor(int node, int kth)
{
if(kth>n) return 0;
for(int i=0; i<maxp2; i++)
{
if(kth&(1<<i))//numarul stramosului se imparte la 2^i -> mut nodul 2^i pozitii mai sus
{
node=stramos[i][node];
}
}
return node;
}
int main()
{
int q, p;
in>>n>>m;
for(int i=1; i<=n; i++)
{
in>>v[i];
stramos[0][i]=v[i];
}
PrecalculateAncestors();
for(int i=1; i<=m; i++)
{
in>>q>>p;//al p-lea stramos al nodului q
out<<FindAncestor(q, p)<<'\n';
}
return 0;
}