Pagini recente » Cod sursa (job #1997226) | Cod sursa (job #1757936) | Cod sursa (job #467041) | Cod sursa (job #667238) | Cod sursa (job #2090972)
//Metoda 1: asemanator cu problema Cerere(stiva+dfs)
//O(1) pe query
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
vector<int> St;
vector<int> V[350005];
vector<pair<int,int> > Q[350005];
int R[400005],p,q,n,m,nr,S[350005];
int i[350005];
void dfs(int &nod)
{
for(i[nod]=0; i[nod]<Q[nod].size(); i[nod]++)
{
if(Q[nod][i[nod]].first<nr)
R[Q[nod][i[nod]].second]=S[nr-Q[nod][i[nod]].first];
else
R[Q[nod][i[nod]].second]=0;
}
for(i[nod]=0; i[nod]<V[nod].size(); i[nod]++)
{
nr++;
S[nr]=V[nod][i[nod]];
dfs(V[nod][i[nod]]);
}
nr--;
}
int main()
{
fi>>n>>m;
for(int i=1; i<=n; i++)
{
fi>>p;
if(p==0)
St.push_back(i);
else
V[p].push_back(i);
}
for(int i=1; i<=m; i++)
{
fi>>q>>p;
Q[q].push_back({p,i});
}
for(int i=0; i<St.size(); i++)
{
nr=1;
S[1]=St[i];
dfs(St[i]);
}
for(int i=1; i<=m; i++)
{
fo<<R[i]<<"\n";
}
fi.close();
fo.close();
return 0;
}