Pagini recente » Cod sursa (job #650844) | Cod sursa (job #2868744) | Cod sursa (job #2580167) | Cod sursa (job #3201850) | Cod sursa (job #1229475)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <deque>
#include <stack>
using namespace std ;
const int NMAX = 350005 ;
const int QMAX = 400005 ;
const int INF = 0x3f3f3f3f ;
ifstream cin("stramosi.in") ;
ofstream cout("stramosi.out") ;
void READ() ;
void OUT() ;
void DFS(int) ;
vector <int> G[NMAX] ;
vector <pair <int, int > > D[NMAX] ;
int raspuns[QMAX], st[NMAX] ;
int N, M, Varf;
inline void READ()
{
cin >> N >> M ;
for(int i = 1 ; i <= N ; ++ i)
{
int x ;
cin >> x ;
G[x].push_back(i) ;
}
for(int i = 1 ; i <= M ; ++ i)
{
int A, B;
cin >> A >> B ;
D [A].push_back(make_pair(B, i)) ;
}
}
void DFS(int K)
{
st[ ++ Varf] = K ;
for(vector <pair <int, int> > ::iterator it = D[K].begin() ; it != D[K].end() ; ++ it)
{
int pozitia_stramosului = it->first ;
int nr_intrebare = it->second ;
if(Varf - pozitia_stramosului >= 1)
raspuns [ nr_intrebare] = st[Varf - pozitia_stramosului] ;
else raspuns [nr_intrebare] = 0 ;
}
for(vector <int> ::iterator it = G[K].begin() ; it != G[K].end() ; ++ it)
DFS(*it) ;
st[ Varf --] = 0 ;
}
inline void OUT()
{
for(int i = 1 ; i <= M ; ++ i)
{
cout << raspuns[i] << '\n' ;
}
}
int main()
{
READ() ;
DFS(0) ;
OUT() ;
cin.close() ;
cout.close() ;
return 0 ;
}