Pagini recente » Cod sursa (job #990847) | Cod sursa (job #513678) | Cod sursa (job #2571148) | Cod sursa (job #716515) | Cod sursa (job #1046206)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector <int> fii[400002];
vector <pair <int,int> > res[400002];
vector <int> stiva;
int n,nq,i,j,nr,q,p,s,r[400002];
void go(int nod)
{
int s=res[nod].size();
int szst=stiva.size();
for (int i=0;i<s;i++)
if (res[nod][i].first>szst)
res[nod][i].first=0;
else
res[nod][i].first=stiva[szst-res[nod][i].first];
stiva.push_back(nod);
s=fii[nod].size();
for (int i=0;i<s;i++)
go(fii[nod][i]);
stiva.pop_back();
}
int main(void)
{
FILE * f;
f=fopen("stramosi.in","r");
ofstream g("stramosi.out");
fscanf(f,"%d%d",&n,&nq);
for (i=1;i<=n;i++)
{
fscanf(f,"%d",&nr);
fii[nr].push_back(i);
}
for (i=1;i<=nq;i++)
{
fscanf(f,"%d%d",&q,&p);
res[q].push_back(make_pair(p,i));
}
s=fii[0].size();
for (i=0;i<s;i++)
go(fii[0][i]);
for (i=1;i<=n;i++)
{
s=res[i].size();
for (j=0;j<s;j++)
r[res[i][j].second]=res[i][j].first;
}
for (i=1;i<=nq;i++)
g<<r[i]<<'\n';
return 0;
}