Cod sursa(job #2090888)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 18 decembrie 2017 20:17:24
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
//Metoda 1: asemanator cu problema Cerere(stiva+dfs)
//O(1) pe query
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
vector<int> St;
vector<int> V[350005];
vector<pair<int,int> > Q[350005];
int R[400005],p,q,i,n,m,nr,S[350005];

void dfs(int nod)
{
    int i,j;
    nr++;
    //cout<<"Am ajuns in "<<nod<<"\n";
    for(i=0; i<V[nod].size(); i++)
    {
        for(j=0; j<Q[V[nod][i]].size(); j++)
        {
            //cout<<"Caut rezultat pentru "<<V[nod][i]<<"\n";
            if(Q[V[nod][i]][j].first<nr)
                R[Q[V[nod][i]][j].second]=S[nr-Q[V[nod][i]][j].first];
            else
                R[Q[V[nod][i]][j].second]=0;
        }
        S[nr]=V[nod][i];
        dfs(V[nod][i]);
    }
    S[nr]=0;
    nr--;
}

int main()
{
    fi>>n>>m;
    for(i=1; i<=n; i++)
    {
        fi>>p;
        if(p==0)
            St.push_back(i);
        else
            V[p].push_back(i);
    }
    for(i=1; i<=m; i++)
    {
        fi>>q>>p;
        Q[q].push_back({p,i});
    }
    for(i=0; i<St.size(); i++)
    {
        nr=1;
        S[1]=St[i];
        dfs(St[i]);
    }
    for(i=1; i<=m; i++)
    {
        fo<<R[i]<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}