Pagini recente » Cod sursa (job #2547608) | Cod sursa (job #3165272) | Borderou de evaluare (job #2223581) | Borderou de evaluare (job #1565253) | Cod sursa (job #1988499)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nMax = 250005;
const int mMax = 300005;
int n, m;
vector<int> child[nMax];
bool hasFather[nMax];
vector<pair<int, int> > query[nMax];
vector<int> st;
int rasp[mMax];
void citire()
{
ifstream in("stramosi.in");
in >> n >> m;
int s;
for(int i = 1; i <= n; ++i)
{
in >> s;
if(s != 0)
{
child[s].push_back(i);
hasFather[i] = true;
}
}
int q, p;
for(int i = 1; i <= m; ++i)
{
in >> q >> p;
query[q].push_back(make_pair(p, i));
}
in.close();
}
void DFS(int current)
{
st.push_back(current);
static int p, id, i;
for(i = 0; i < query[current].size(); ++i)
{
p = query[current][i].first;
id = query[current][i].second;
if(st.size() >= p + 1)
rasp[id] = st[st.size() - p - 1];
else
rasp[id] = 0;
}
for(auto c:child[current])
DFS(c);
st.pop_back();
}
void rezolvare()
{
st.reserve(n);
for(int i = 1; i <= n; ++i)
if(hasFather[i] == false)
DFS(i);
}
void afisare()
{
ofstream out("stramosi.out");
for(int i = 1; i <= m; ++i)
out << rasp[i] << "\n";
out.close();
}
int main()
{
citire();
rezolvare();
afisare();
return 0;
}