Cod sursa(job #1469661)

Utilizator theep0Cruceru Radu theep0 Data 9 august 2015 03:03:43
Problema Stramosi Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 250001

typedef struct membru {
    int idx;
    struct membru *stramosi[20];
    struct membru *children, *next;
} membru;

membru *newmembru (int id) {
    membru *m = (membru*) malloc(sizeof(membru));
    m->idx = id;
    m->stramosi[0] = NULL;
    m->children = NULL;
    m->next = NULL;
    return m;
}

void addchild(membru *f, membru *c) {
    c->next = f->children;
    f->children = c;
    c->stramosi[0] = f;
}

membru *members[MAXN];
int roots[MAXN];
int q[MAXN];

int N, M, P, Q, R;

void build_tree() {
    int ql = 0, qr = 1;
    int curr;
    int i;
    membru *c, *s;
    while(ql != qr) {
        curr = q[ql++];
        c = members[curr]->children;
        while (c != NULL) {
            q[qr++] = c->idx;
            c = c->next;
        }
        if (members[curr]->stramosi[0] == NULL) continue;

        for (i = 1; i < 20; i++) {
            s = members[curr]->stramosi[i - 1];
            if (s) s = s->stramosi[i-1];
            members[curr]->stramosi[i] = s;
        }
    }
}

int ans(int q, int p) {
    int i;
    membru *c = members[q];
    while (p != 0) {
        for (i = 1; i < 20 && (1 << i) < p; i++);
        i--;
        p -= (1 << i);
        c = c->stramosi[i];
        if (c == NULL) {
            return 0;
        }
    }
    return c->idx;
}

int main() {
    int i, j, ap, aq;
    FILE *fi = freopen("stramosi.in", "r", stdin);
    FILE *fo = freopen("stramosi.out", "r", stdout);
    scanf("%d %d", &N, &M);
    for (R = 0, i = 1; i <= N; i++) {
        members[i] = newmembru(i);
        scanf("%d", &j);
        if (j != 0) {
            addchild(members[j], members[i]);
        } else {
            roots[R++] = i;
        }
    }
    for (i = 0; i < R; i++) {
        q[0] = roots[i];
        build_tree();
    }
    for (i = 0; i < M; i++) {
        scanf("%d %d", &aq, &ap);
        printf("%d\n", ans(aq, ap));
    }
    fclose(fi);
    fclose(fo);
    return 0;
}