Cod sursa(job #2049326)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 27 octombrie 2017 07:46:11
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>
using namespace std;
const int N = 250005;
const int M = 300005;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
struct intrebare
{
    int poz,q;
}v[M];

int n,m;
vector <int> V[N];
vector <int> lst[N];

int stiv[N],k;

bool viz[N];
bool tata[N];
int rasp[M];

void raspund(int val)
{
    //g<<val<<"| ";
    for(int i = 0; i < lst[val].size(); i++)
    {
        int num = lst[val][i];
        int ind = k - v[num].q;

        //g<<lst[val][i]<<" ";
        if(ind > 0 )
        {
            rasp[num] = stiv[ind];
        }
        else
            rasp[num] = 0;
    }
    //g<<"\n";
}

void dfs(int x)
{
    k++;
    viz[x]  = 1;
    stiv[k] = x;
    raspund(x);
    for(int i = 0; i < V[x].size();i++)
    {
        int num = V[x][i];
        if(viz[num]==0)
        {
            dfs(num);
        }
    }
    k--;
}

int main()
{
    f>>n>>m;
    for(int i = 1; i<= n; i++)
    {
        int x;
        f>>x;
        if(x > 0)
        {
            V[x].push_back(i);
            tata[i] = 1;
        }
    }

    for(int i = 1; i<= m; i++)
    {
        int p;
        f>>p>>v[i].q;
        v[i].poz = i;
        lst[p].push_back(i);
    }
    for(int i = 1; i<= n; i++)
    {
        if(tata[i] == 0)
        {
            dfs(i);
        }

    }
    for(int i = 1; i<= m; i++)
    {
        g<<rasp[i]<<"\n";
    }
    f.close();
    g.close();
    return 0;
}