Pagini recente » Cod sursa (job #1552469) | Cod sursa (job #1470840) | Cod sursa (job #1058514) | Cod sursa (job #361152) | Cod sursa (job #2090838)
//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<vector<int> > V;
vector<vector<pair<int,int> > > Q;
int R[300001],p,q,i,n,m,nr,S[250001];
void dfs(int nod)
{
int i,j;
nr++;
//cout<<"Am ajuns in "<<nod<<"\n";
for(i=0; i<V[nod].size(); i++)
{
for(j=0; j<Q[V[nod][i]].size(); j++)
{
//cout<<"Caut rezultat pentru "<<V[nod][i]<<"\n";
if(Q[V[nod][i]][j].first<nr)
R[Q[V[nod][i]][j].second]=S[nr-Q[V[nod][i]][j].first];
else
R[Q[V[nod][i]][j].second]=0;
}
S[nr]=V[nod][i];
dfs(V[nod][i]);
}
S[nr]=0;
nr--;
}
int main()
{
fi>>n>>m;
V.reserve(n+1);
Q.reserve(n+1);
V.resize(n+1);
Q.resize(n+1);
for(i=1; i<=n; i++)
{
fi>>p;
if(p==0)
St.push_back(i);
else
V[p].push_back(i);
}
for(i=1; i<=m; i++)
{
fi>>q>>p;
Q[q].push_back({p,i});
}
for(i=0; i<St.size(); i++)
{
nr=1;
S[1]=St[i];
dfs(St[i]);
}
for(i=1; i<=m; i++)
{
fo<<R[i]<<"\n";
}
fi.close();
fo.close();
return 0;
}