Pagini recente » Cod sursa (job #973442) | Cod sursa (job #753114) | Cod sursa (job #1802446) | Cod sursa (job #389367) | Cod sursa (job #971485)
Cod sursa(job #971485)
#include<stdio.h>
#include<vector>
#define mp make_pair
#define pb push_back
#define popb pop_back
#define maxn 250005
#define maxm 300005
using namespace std;
int n,m,u;
int v[maxn],r[maxn],sol[maxm];
int stack[maxn];
vector <int> l[maxn];
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 r[i]=1;
}
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(i=1;i<=n;i++)
if(r[i]) { u=0; dfs(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;
}