Pagini recente » Cod sursa (job #369855) | Cod sursa (job #616553) | Cod sursa (job #1672309) | Cod sursa (job #2088695) | Cod sursa (job #1196923)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("stramosi.in");
ofstream os("stramosi.out");
#define DIM 250001
int N, M,x ,y;
int Tata[DIM];
vector <int> G[DIM];
vector <int> Q[300001];
vector <int> Nr[300001];
int Stack[DIM];
int Sol[300001];
bool Vis[DIM];
int it;
void Input();
void DFS(int nod);
int main()
{
Input();
for ( int i = 1; i <= N; ++i )
if ( Tata[i] == 0)
DFS(i);
for ( int i = 1; i <= M; ++i )
os << Sol[i] << '\n';
is.close();
os.close();
}
void Input()
{
is >> N >> M;
for ( int i = 1; i <= N; ++i )
{
is >> Tata[i];
G[Tata[i]].push_back(i);
}
for ( int i = 1; i <= M; ++i )
{
is >> x >> y;
Q[x].push_back(y);
Nr[x].push_back(i);
}
}
void DFS(int nod)
{
bool Filip(false); it++;
Stack[it] = nod;
Vis[nod] = true;
while ( it > 0 )
{
Filip = false;
for ( int i = 0; i < Nr[Stack[it]].size(); ++i )
if ( it - Q[Stack[it]][i] > 0)
Sol[Nr[Stack[it]][i]] = Stack[it - Q[Stack[it]][i]];
for ( int i = 0; i < G[Stack[it]].size(); ++i )
{
if ( Vis[G[Stack[it]][i]] == false )
{
it++; Filip = true;
Stack[it] = G[Stack[it-1]][i];
Vis[Stack[it]] = true;
i = G[Stack[it]].size();
}
}
if ( Filip == false )
it--;
}
}