Cod sursa(job #1849770)

Utilizator raulrusu99Raul Rusu raulrusu99 Data 17 ianuarie 2017 20:10:30
Problema Stramosi Scor 100
Compilator cpp Status done
Runda gym_emag_avansati_2016 Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
#define MAXN 250010
#define MAXM 350010
int n,m,v[MAXM],x,y,stv[MAXM],d,i,dim[MAXN],grad[MAXN],stiva[MAXN],stvd,agr;
vector <int> G[MAXN],Q[MAXN],rez[MAXN];
void adaug(int val, int gr)
{
    stvd++;
    stiva[stvd]=val;
    grad[stvd]=gr;
}
void eliminare()
{
    stiva[stvd]=0;
    grad[stvd]=0;
    stvd--;
}
void DFS(int nod)
{
    adaug(nod,0);
    while(stvd)
    {
        nod=stiva[stvd];
        agr=grad[stvd];
        eliminare();
        d=agr;
        stv[d]=nod;
        for(auto itr:Q[nod])
        {
            x=d-itr;
            if(x>=1)
                rez[nod].push_back(stv[x]);
            else
                rez[nod].push_back(0);
        }
        for(auto it:G[nod])
            adaug(it,agr+1);
    }
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        G[x].push_back(i);
    }
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[i]=x;
        Q[x].push_back(y);
    }
    DFS(0);
    for(i=1;i<=m;i++)
    {
        g<<rez[v[i]][dim[v[i]]]<<"\n";
        dim[v[i]]++;
    }
    return 0;
}