Cod sursa(job #2090972)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 18 decembrie 2017 21:42:40
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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,n,m,nr,S[350005];
int i[350005];

void dfs(int &nod)
{
    for(i[nod]=0; i[nod]<Q[nod].size(); i[nod]++)
    {
        if(Q[nod][i[nod]].first<nr)
            R[Q[nod][i[nod]].second]=S[nr-Q[nod][i[nod]].first];
        else
            R[Q[nod][i[nod]].second]=0;
    }
    for(i[nod]=0; i[nod]<V[nod].size(); i[nod]++)
    {
        nr++;
        S[nr]=V[nod][i[nod]];
        dfs(V[nod][i[nod]]);
    }
    nr--;
}

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