Pagini recente » Cod sursa (job #1444526) | Cod sursa (job #2202486) | Cod sursa (job #2729367) | Cod sursa (job #1147725) | Cod sursa (job #3289906)
#ifndef LOCAL
#pragma GCC optimize("O3")
// #pragma GCC target("avx2")
#endif
#ifdef LOCAL
#define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>
using ll = long long;
using ci = const int;
using cll = const long long;
using namespace std;
const int QMAX = 3e5 + 5;
const int NMAX = 2e5 + 5e4 + 5;
/*******************************/
// INPUT / OUTPUT
#ifndef LOCAL
ifstream in("stramosi.in");
ofstream out("stramosi.out");
#define cin in
#define cout out
#endif
/*******************************/
/// GLOBAL DECLARATIONS
int N, Q;
int rasp[QMAX];
struct Query
{
int cati, idx;
Query(int _cati, int _idx) { cati = _cati; idx = _idx;}
};
vector <int> adj[NMAX];
vector <Query> queries[NMAX];
/*******************************/
/// FUNCTIONS
void ReadInput();
void Solution();
void Output();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
cin >> N >> Q;
int par;
for (int i = 1 ; i <= N ; ++ i)
{
cin >> par;
adj[par].push_back(i);
}
int node, cati;
for (int i = 0 ; i < Q ; ++ i)
{
cin >> node >> cati;
queries[node].push_back({cati, i});
}
}
///-------------------------------------
inline void dfs(int node, vector <int> &stramosi)
{
for (auto q: queries[node])
{
if (q.cati <= stramosi.size())
rasp[q.idx] = stramosi[stramosi.size() - q.cati];
else
rasp[q.idx] = 0;
}
stramosi.push_back(node);
for (auto u: adj[node]) dfs(u, stramosi);
stramosi.pop_back();
}
///-------------------------------------
inline void Solution()
{
vector <int> stramosi;
dfs(0, stramosi);
}
///-------------------------------------
inline void Output()
{
for (int i = 0 ; i < Q ; ++ i) cout << rasp[i] << "\n";
}
///-------------------------------------
int main()
{
#ifndef LOCAL
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
#endif
ReadInput();
Solution();
Output();
return 0;
}