Cod sursa(job #1735760)

Utilizator liviu23Liviu Andrei liviu23 Data 30 iulie 2016 22:12:57
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
#define DIM 250005
using namespace std;

int n,m,vf[DIM],st[DIM],ans[300005];
vector<int> adj[DIM];
vector<pair<int,int> > q[DIM];

void dfs(int p) {
    st[++st[0]]=p;
    while(st[0]) {
        p=st[st[0]];
        if(adj[p][0]>=adj[p].size()-1) {
            st[0]--;
            continue;
        }
        adj[p][0]++;
        int pN=adj[p][adj[p][0]];
        st[++st[0]]=pN;
        for(int i=0;i<q[pN].size();i++) {
            if(st[0]<=q[pN][i].first)
                ans[q[pN][i].second]=0;
            else
                ans[q[pN][i].second]=st[st[0]-q[pN][i].first];
        }
    }
}

int main()
{
    ifstream fin("stramosi.in");
    ofstream fout("stramosi.out");
    fin>>n>>m;
    int a,b;
    for(int i=1;i<=n;i++) {
        if(adj[i].size()==0)
            adj[i].push_back(0);
        fin>>a;
        if(a==0)
            vf[++vf[0]]=i;
        else {
            if(adj[a].size()==0)
                adj[a].push_back(0);
            adj[a].push_back(i);
        }
    }
    for(int i=1;i<=m;i++) {
        fin>>a>>b;
        q[a].push_back({b,i});
    }
    for(int i=1;i<=vf[0];i++)
        dfs(vf[i]);
    for(int i=1;i<=m;i++)
        fout<<ans[i]<<'\n';
    return 0;
}