Pagini recente » Cod sursa (job #941488) | Cod sursa (job #1500912) | Cod sursa (job #1629005) | Cod sursa (job #1565808) | Cod sursa (job #971471)
Cod sursa(job #971471)
#include<stdio.h>
#include<vector>
#define mp make_pair
#define pb push_back
#define maxn 250005
#define maxm 300005
using namespace std;
struct query{int node,father;} q[maxm];
int n,m,u,nr;
int v[maxn],sol[maxn],t[maxn],r[maxn];
int stack[maxn];
vector <int> l[maxn];
void read()
{
int i;
int x;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x!=0)
{
l[x].pb(i);
l[i].pb(x);
}
else r[i]=1;
}
for(i=1;i<=m;i++) { scanf("%d%d",&q[i].node,&q[i].father); t[q[i].node]=q[i].father; }
}
void dfs(int k)
{
v[k]=nr; stack[++u]=k;
if(u-t[k]>0) sol[k]=stack[u-t[k]];
else sol[k]=0;
for(unsigned int i=0;i<l[k].size();i++)
if(v[l[k][i]]!=nr)
dfs(l[k][i]);
u--;
}
void solve()
{
int i;
for(i=1;i<=n;i++)
if(r[i])
{
u=0; nr++;
dfs(i);
}
}
void print()
{
int i;
for(i=1;i<=m;i++)
printf("%d\n",sol[q[i].node]);
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
read();
solve();
print();
fclose(stdin);
fclose(stdout);
return 0;
}