Cod sursa(job #3289906)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 29 martie 2025 10:18:16
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#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;
}