Cod sursa(job #1196923)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 9 iunie 2014 20:33:00
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("stramosi.in");
ofstream os("stramosi.out");

#define DIM 250001

int N, M,x ,y;
int Tata[DIM];
vector <int> G[DIM];
vector <int> Q[300001];
vector <int> Nr[300001];
int Stack[DIM];
int Sol[300001];
bool Vis[DIM];
int it;

void Input();
void DFS(int nod);

int main()
{
    Input();
    for ( int i = 1; i <= N; ++i )
        if ( Tata[i] == 0)
        DFS(i);
    for ( int i = 1; i <= M; ++i )
        os << Sol[i] << '\n';
    is.close();
    os.close();
}

void Input()
{
    is >> N >> M;
    for ( int i = 1; i <= N; ++i )
    {
        is >> Tata[i];
        G[Tata[i]].push_back(i);
    }
    for ( int i = 1; i <= M; ++i )
    {
        is >> x >> y;
        Q[x].push_back(y);
        Nr[x].push_back(i);
    }
}

void DFS(int nod)
{
    bool Filip(false); it++;
    Stack[it] = nod;
    Vis[nod] = true;
    while ( it > 0 )
    {
        Filip = false;
        for ( int i = 0; i < Nr[Stack[it]].size(); ++i )
            if ( it - Q[Stack[it]][i] > 0)
            Sol[Nr[Stack[it]][i]] = Stack[it - Q[Stack[it]][i]];
        for ( int i = 0; i < G[Stack[it]].size(); ++i )
        {
            if ( Vis[G[Stack[it]][i]] == false )
            {
                it++; Filip = true;
                Stack[it] = G[Stack[it-1]][i];
                Vis[Stack[it]] = true;
                i = G[Stack[it]].size();
            }
        }
        if ( Filip == false )
            it--;
    }
}