Pagini recente » Borderou de evaluare (job #2493630) | Borderou de evaluare (job #1737359) | Borderou de evaluare (job #1652171) | Borderou de evaluare (job #1697918) | Cod sursa (job #1988493)
#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);
int p, id;
for(auto q:query[current])
{
p = q.first;
id = q.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 + 1);
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;
}