Pagini recente » Cod sursa (job #1294173) | Cod sursa (job #816171) | Cod sursa (job #998601) | Cod sursa (job #2682815) | Cod sursa (job #1735759)
#include <fstream>
#include <vector>
#define DIM 250005
using namespace std;
int n,m,vf[DIM],st[DIM],ans[300005];
vector<int> adj[DIM];
vector<pair<int,int> > q[DIM];
void dfs(int p) {
st[++st[0]]=p;
while(st[0]) {
p=st[st[0]];
if(adj[p][0]>=adj[p].size()-1) {
st[0]--;
continue;
}
adj[p][0]++;
int pN=adj[p][adj[p][0]];
st[++st[0]]=pN;
for(int i=0;i<q[pN].size();i++) {
if(st[0]<=q[pN][i].first)
ans[q[pN][i].second]=0;
else
ans[q[pN][i].second]=st[st[0]-q[pN][i].first];
}
}
}
/*void dfs(int p) {
st[++st[0]]=p;
for(int i=0;i<q[p].size();i++) {
if(st[0]-q[p][i].first<=0)
ans[q[p][i].second]=0;
else
ans[q[p][i].second]=st[st[0]-q[p][i].first];
}
for(int i=0;i<adj[p].size();i++)
dfs(adj[p][i]);
st[0]--;
}*/
int main()
{
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
fin>>n>>m;
int a,b;
for(int i=1;i<=n;i++) {
if(adj[i].size()==0)
adj[i].push_back(0);
fin>>a;
if(a==0)
vf[++vf[0]]=i;
else {
if(adj[a].size()==0)
adj[a].push_back(0);
adj[a].push_back(i);
}
}
for(int i=1;i<=m;i++) {
fin>>a>>b;
q[a].push_back({b,i});
}
for(int i=1;i<=vf[0];i++)
dfs(vf[i]);
for(int i=1;i<=m;i++)
fout<<ans[i]<<'\n';
return 0;
}