Pagini recente » Cod sursa (job #2631115) | Cod sursa (job #1025200) | Cod sursa (job #2766804) | Cod sursa (job #3031498) | Cod sursa (job #1849770)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
#define MAXN 250010
#define MAXM 350010
int n,m,v[MAXM],x,y,stv[MAXM],d,i,dim[MAXN],grad[MAXN],stiva[MAXN],stvd,agr;
vector <int> G[MAXN],Q[MAXN],rez[MAXN];
void adaug(int val, int gr)
{
stvd++;
stiva[stvd]=val;
grad[stvd]=gr;
}
void eliminare()
{
stiva[stvd]=0;
grad[stvd]=0;
stvd--;
}
void DFS(int nod)
{
adaug(nod,0);
while(stvd)
{
nod=stiva[stvd];
agr=grad[stvd];
eliminare();
d=agr;
stv[d]=nod;
for(auto itr:Q[nod])
{
x=d-itr;
if(x>=1)
rez[nod].push_back(stv[x]);
else
rez[nod].push_back(0);
}
for(auto it:G[nod])
adaug(it,agr+1);
}
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
G[x].push_back(i);
}
for(i=1;i<=m;i++)
{
f>>x>>y;
v[i]=x;
Q[x].push_back(y);
}
DFS(0);
for(i=1;i<=m;i++)
{
g<<rez[v[i]][dim[v[i]]]<<"\n";
dim[v[i]]++;
}
return 0;
}