Cod sursa(job #1988499)

Utilizator Preda_MihaiPreda Mihai Dragos Preda_Mihai Data 3 iunie 2017 10:38:45
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#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;
}