Cod sursa(job #1979292)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 10 mai 2017 09:50:39
Problema Stramosi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <vector>
#include <stack>

#define MAXN 250001

using namespace std;

ifstream f ("stramosi.in");
ofstream g ("stramosi.out");

vector < int > v[MAXN];
vector < int > sol[MAXN];
vector < int > stiva;
vector < int > p;
stack < int > root;
stack < int > dfs;

int n, m;

int main(){
    f >> n >> m;
    for(int i = 1; i <= n; ++i){
        int x;
        f >> x;
        if(x) v[x].push_back(i);
        else root.push(i);
        p.push_back(x);
    }

    while(!root.empty()){
        dfs.push(root.top());
        while(!dfs.empty()){
            int u = dfs.top();
            dfs.pop();
            if(!stiva.empty()){
                while(stiva[stiva.size() - 1] != p[u - 1] && !stiva.empty()){
                    stiva.erase(stiva.begin() - 1 + stiva.size());
                }
            }
            stiva.push_back(u);

            int k = v[u].size();
            int l = stiva.size();
            for(int i = 0; i < k; ++i){
                int nod = v[u][i];
                for(int j = l - 1; j >= 0; --j) sol[nod].push_back(stiva[j]);
                dfs.push(nod);
            }


        }
        root.pop();
    }
    for(int i = 1; i <= m; ++i){
        int x, y;
        f >> x >> y;
        if(y < sol[x].size() + 1) g << sol[x][y - 1] << '\n';
        else g << 0 << '\n';
    }
}