Pagini recente » Cod sursa (job #1962398) | Cod sursa (job #863044) | Cod sursa (job #601970) | Cod sursa (job #2108144) | Cod sursa (job #1473300)
#include <iostream>
#include <stdio.h>
#include <vector>
#define NMax 250001
#define MMax 300001
using namespace std;
int D[NMax],tata[NMax],P[MMax],Sol[MMax],N,M,x;
vector<int> Graf[NMax],Q[NMax];
bool uz[NMax];
void Solve(int nod)
{
for(vector<int>::iterator it=Q[nod].begin();it!=Q[nod].end();it++)
{
int &sol1=Sol[*it];
if(D[nod]<P[*it])
sol1=0;
else
sol1=tata[D[nod]-P[*it]];
}
}
void DFS(int nod)
{
uz[nod]=true;
tata[D[nod]]=nod;
Solve(nod);
for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
if(uz[*it]==false)
{
D[*it]=D[nod]+1;
DFS(*it);
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
{
scanf("%d",&x);
Graf[x].push_back(i);
}
for(int i=1;i<=M;i++)
{
scanf("%d%d",&x,&P[i]);
Q[x].push_back(i);
}
for(int i=1;i<=N;i++)
if(!uz[i])
DFS(i);
for(int i=1;i<=M;i++)
printf("%d\n",Sol[i]);
}