Cod sursa(job #2066570)

Utilizator CammieCamelia Lazar Cammie Data 15 noiembrie 2017 09:40:13
Problema Stramosi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <vector>
#include <queue>

#define MAXN 250005
#define MAXM 300005

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n, m, query[MAXM], stiva[MAXN], nn;

struct punct{
    int k, nr_ordine;
};

vector <int> G[MAXN];
vector <punct> Query[MAXN];
queue <int> Q;

inline void Read() {
    int aux, q, p;

    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> aux;

        if (!aux)
            Q.push(i);
        else
            G[aux].push_back(i);
    }

    for (int i = 1; i <= m; i++){
        fin >> q >> p;

        Query[q].push_back({p, i});
    }
}

inline void DFS() {
    int nod = stiva[nn];
    for (auto x : Query[nod]) {
        query[x.nr_ordine] = stiva[nn - x.k];
    }

    for (auto x : G[nod]) {
        stiva[++nn] = x;
        DFS();
    }

    nn--;
}

inline void Solve() {
    int z;
    while (!Q.empty()) {
        z = Q.front();
        stiva[nn = 1] = z;

        DFS();
        Q.pop();
    }
}

inline void Write() {
    for (int i = 1; i <= m; i++)
        fout << query[i] << "\n";
}

int main () {
    Read();
    Solve();
    Write();

    fin.close(); fout.close(); return 0;
}