Pagini recente » Cod sursa (job #3153745) | Cod sursa (job #2669371) | Cod sursa (job #1656256) | Cod sursa (job #1634088) | Cod sursa (job #2090954)
//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[250005];
vector<pair<int,int> > Q[250005];
int R[300005],p,q,n,m,nr,S[250005];
int i[250005],j;
void dfs(int nod)
{
nr++;
//cout<<"Am ajuns in "<<nod<<"\n";
for(i[nod]=0; i[nod]<V[nod].size(); i[nod]++)
{
for(j=0; j<Q[V[nod][i[nod]]].size(); j++)
{
//cout<<"Caut rezultat pentru "<<V[nod][i]<<"\n";
if(Q[V[nod][i[nod]]][j].first<nr)
R[Q[V[nod][i[nod]]][j].second]=S[nr-Q[V[nod][i[nod]]][j].first];
else
R[Q[V[nod][i[nod]]][j].second]=0;
}
S[nr]=V[nod][i[nod]];
dfs(V[nod][i[nod]]);
}
S[nr]=0;
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;
}