Pagini recente » Statistici Adelina Heroiu (adelinaheroiu) | Cod sursa (job #2780798) | Cod sursa (job #1252483) | Cod sursa (job #953154) | Cod sursa (job #1471781)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <deque>
using namespace std;
const int MAXN = 250000, MAXP = 17;
int N, M, dp[MAXN+1][MAXP+1], father[MAXN+1];
vector < vector <int> > G(MAXN+1);
int p(int x)
{
while(x)
{
int y = ((x^(x-1))&x);
cout<<y<<endl;
x -= y;
}
}
void readData()
{
scanf("%d %d",&N,&M);
for(int i = 1; i <= N; i++)
{
int x; scanf("%d",&x);
father[ i ] = x;
dp[ i ][ 0 ] = x;
G[ x ].push_back( i );
}
}
int vis[MAXN+1];
void dfs(int node)
{
vis[ node ] = 1;
for(int i = 0; i < G[node].size(); i++)
{
int next = G[node][i];
if( vis[next] == 0 )
{
for(int k = 1; dp[ dp[next][k-1] ][k-1] != 0; k++)
dp[next][k] = dp[ dp[next][k-1] ][k-1];
dfs(next);
}
}
}
void dfsIterativ(int node)
{
queue <int> c;
c.push(node);
vis[node] = 1;
while(c.empty() == false)
{
int curr = c.front();
if(G[curr].size() != 0)
{
int next = G[curr][G[curr].size()-1];
if( vis[next] == 0 )
{
for(int k = 1; dp[ dp[next][k-1] ][k-1] != 0; k++)
dp[next][k] = dp[ dp[next][k-1] ][k-1];
c.push(next);
}
G[curr].pop_back();
}
else
{
c.pop();
}
}
}
void doDfs()
{
for(int i = 1; i <= N; i++)
if( father[i] == 0 )
dfsIterativ(i);
}
int greatestPowerOfTwo(int x)
{
int pwr = 1, ans = 0;
while( pwr <= x )
{
pwr *= 2;
ans++;
}
pwr /= 2, ans--;
return ans;
}
int querry(int Q, int P)
{
if( P == 0 )
return Q;
else
{
int pwr = 1, exp = 0;
while( pwr <= P )
{
pwr *= 2;
exp++;
}
pwr /= 2, exp--;
return querry( dp[Q][ exp ], P - pwr );
}
}
void answerQuerries()
{
for(int i = 1; i <= M; i++)
{
int Q, P; scanf("%d %d",&Q,&P);
printf("%d\n", querry(Q,P));
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
readData();
doDfs();
answerQuerries();
return 0;
}