Cod sursa(job #1214245)

Utilizator SeBy24Cont Sters SeBy24 Data 29 iulie 2014 21:26:40
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#include <bitset>
#define maxm 1<<19
#define maxn 230000
#define pb push_back
#define sz size

using namespace std;

ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

struct stiva { int nod, level; };
stiva stf [maxm];
int N, M, i, p, q , a, cap, node, lev;
int st [maxm];
vector <int> listv [maxm];
vector <int> listp [maxm], G [maxm];
int sol [maxm], fat [maxm];
bool viz [maxm];

void dfs () {
    int j;
    while (1) {
    node = stf [cap].nod;
    lev = stf [cap].level;
    viz [node] = true;
    st [lev] = node;
    if (!cap) return;
    else --cap ;

    for (j = 0; j < listv [node].sz (); j++)
            if (lev > listv [node][j]) sol [listp [node][j]] = st [lev - listv [node][j]];
    for (j = 0; j < G [node].sz (); j++)
        if (!viz [G [node][j]]) {
            ++cap;
            stf [cap].nod = G [node][j];
            stf [cap].level = lev + 1;
        }
    }
}

int main () {

    int a;
    fin >> N >> M;
    for (i = 1; i <= N; i++) {
        fin >> a;
        fat [i] = a;
        G [a].pb (i);
    }
    for (i = 1; i <= M; i++)
    {
        fin >> q >> p;
        listv [q].pb (p);
        listp [q].pb (i);
    }
    for (i = 1; i <= N; i++)
        if (!fat [i]) {
            cap = 1;
            stf [cap].level = 1;
            stf [cap].nod = i;
            dfs ();
        }
    for (i = 1; i <= M; i++) fout << sol [i] << "\n";
    return 0;
}