Pagini recente » Cod sursa (job #1350408) | Cod sursa (job #1473238) | Cod sursa (job #3130586) | Cod sursa (job #31790) | Cod sursa (job #971498)
Cod sursa(job #971498)
#include<stdio.h>
#include<vector>
#define mp make_pair
#define pb push_back
#define popb pop_back
#define maxn 300005
#define maxm 300005
using namespace std;
int n,m,u;
int v[maxn],sol[maxm];
int stack[maxn];
vector <int> l[maxn],root;
vector < pair<int,int> > t[maxn];
void read()
{
int i;
int node,father;
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 root.pb(i);
}
for(i=1;i<=m;i++) { scanf("%d%d",&node,&father); t[node].pb(mp(father,i)); }
}
void dfs(int k)
{
v[k]=1; stack[++u]=k;
for(unsigned int i=0;i<t[k].size();i++)
{
if(u-t[k][i].first>0) sol[t[k][i].second]=stack[u-t[k][i].first];
else sol[t[k][i].second]=0;
}
for(unsigned int i=0;i<l[k].size();i++)
if(v[l[k][i]]==0)
dfs(l[k][i]);
u--;
}
void solve()
{
int i;
for(unsigned int i=0;i<root.size();i++)
{ u=0; dfs(root[i]); }
}
void print()
{
for(int i=1;i<=m;i++) printf("%d\n",sol[i]);
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
read();
solve();
print();
fclose(stdin);
fclose(stdout);
return 0;
}