Pagini recente » Cod sursa (job #1103758) | Cod sursa (job #1737531) | Cod sursa (job #1856354) | Cod sursa (job #1413960) | Cod sursa (job #1460520)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 250000, MAXM = 300000, MAXC = 17;
int N, M, a[MAXN+1][MAXC+1], t[MAXN+1], viz[MAXN+1], p2[MAXN+1], hig[MAXN+1];
vector <int> G[MAXN+1];
int h(int x)
{
int rx = x;
if( hig[ x ] != 0 )
return hig[ x ];
while((x & (x - 1)) != 0)
x = x - 1;
hig[ rx ] = x;
return x;
}
void readData()
{
scanf("%d %d",&N,&M);
for(int i = 1; i <= N; i++){
scanf("%d",&t[ i ]);
if(t[ i ] != 0)
{
G[ t[ i ] ].push_back( i );
a[ i ][ 0 ] = t[ i ];
}
else
a[ i ][ 0 ] = i;
}
}
void dfs(int x)
{
viz[ x ] =1;
for(int i = 0; i < G[x].size(); i++)
{
int next = G[ x ][ i ];
if( viz[ next ] == 0 )
{
for(int k = 1; k <= MAXC; k++)
if( t[ a[ next ][ k - 1 ] ] )
a[ next ][ k ] = a[ a[ next ][ k - 1 ] ][ k - 1 ];
dfs(next);
}
}
}
void doDfs()
{
for(int i = 1; i <= N; i++)
if(viz[ i ] == 0)
dfs(i);
}
void printMatrix()
{
for(int i = 1; i <= N; i++)
{
cout<<i<<' '<<' ';
for(int j = 0; j <= 4; j++)
cout<<a[ i ][ j ]<<' ';
cout<<endl;
}
}
int pow2(int x)
{
int nr = 0, xr = x;
if( x == 1 )
return 0;
if( p2[ x ] != 0 )
return p2[ x ];
while( x != 1 )
{
x = x/2;
nr++;
}
p2[ xr ] = nr;
return nr;
}
int querry(int Q, int P)
{
int answer;
if( t[ Q ] == 0 )
return 0;
while( P )
{
answer = a[ Q ][ pow2(h(P)) ];
Q = answer;
P -= h(P);
}
return answer;
}
void answerQuerries()
{
int Q, P;
for(int i = 1; i <= M; i++)
{
scanf("%d %d",&Q,&P);
cout<<querry(Q,P)<<endl;
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
readData();
doDfs();
//printMatrix();
answerQuerries();
}