Cod sursa(job #1969613)

Utilizator RobybrasovRobert Hangu Robybrasov Data 18 aprilie 2017 15:58:27
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <iostream>
#define FOR(i, n) for (int i = 1; i <= n; ++i)
#define iter vector<int>::iterator
#define N 250001
#define S_MAX 1 << 23

using namespace std;

char E[N];
int V[N][18];
int S[N], A[N], *L[N], D[N], *NB[N];
char STR[S_MAX];

void read(int &x, char* &p) {
    x = 0;
    for (; *p < '0' || *p > '9'; ++p);
    for (; *p >= '0' && *p <= '9'; ++p) {
        x = 10 * x + *p - '0';
    }
}

//void dfs(int node) {
////    cout << "recursion stack at node = " << node << "\n";
//    E[node] = 1;
//    S[++S[0]] = node;
//    for (int *it = L[node]; *it != -1; ++it)
//        dfs(*it);
//    int len = S[0];
//    for (int step = 1, k = 0; step < len; step <<= 1, ++k) {
//        V[node].push_back(S[len - step]);
//    }
//    --S[0];
//}

void nonRecDfs(int node) {
    S[1] = node;
    NB[1] = L[node];
    int h = 1;
    while (h > 0) {
        node = S[h];
        int *it = NB[h];
        ++NB[h];
        if (*it != -1) {
            S[++h] = *it;
            NB[h] = L[*it];
        } else {
            for (int step = 1, k = 0; step < h; step <<= 1, ++k)
                V[node][k] = S[h - step];
            E[node] = 1;
            --h;
        }
    }
}

int main() {
    FILE *f = fopen("stramosi.in", "r");
    FILE *g = fopen("stramosi.out", "w");
    fread(STR, 1, S_MAX, f);
    char *ptr = STR;
    int n, m;
    read(n, ptr);
    read(m, ptr);
    FOR(i, n) {
        int x;
        read(x, ptr);
        ++D[x];
        A[i] = x;
    }
    FOR(i, n) {
        L[i] = new int[D[i] + 1];
        L[i][D[i]] = -1;
        D[i] = 0;
    }
    FOR(i, n) {
        if (A[i])
            L[A[i]][D[A[i]]++] = i;
    }

    FOR(i, n) {
        if (!E[i])
            nonRecDfs(i);
    }

    while (m--) {
        int node, p;
        read(node, ptr);
        read(p, ptr);
        int step = 1;
        for (int k = 0; V[node][k] > 0 && step <= p; step <<= 1, ++k)
            if (step & p)
                node = V[node][k];
        fprintf(g, "%d\n", (step > p ? node : 0));
    }
    
    return 0;
}