Pagini recente » Cod sursa (job #3248277) | Cod sursa (job #2612401) | Cod sursa (job #317551) | Cod sursa (job #2063616) | Cod sursa (job #971478)
Cod sursa(job #971478)
#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;
struct query{int node,father;} q[maxm];
int n,m,u;
int v[maxn],r[maxn];
int stack[maxn];
vector <int> l[maxn],f[maxn],sol[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);
for(i=m;i>=1;i--) f[q[i].node].pb(q[i].father);
}
void dfs(int k)
{
v[k]=1; stack[++u]=k;
for(unsigned int i=0;i<f[k].size();i++)
{
if(u-f[k][i]>0) sol[k].pb(stack[u-f[k][i]]);
else sol[k].pb(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()
{
int i;
for(i=1;i<=m;i++)
{
printf("%d\n",sol[q[i].node][sol[q[i].node].size()-1]);
sol[q[i].node].popb();
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
read();
solve();
print();
fclose(stdin);
fclose(stdout);
return 0;
}