Cod sursa(job #69220)

Utilizator DastasIonescu Vlad Dastas Data 1 iulie 2007 21:55:29
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>

#define maxn 250001
#define maxm 300001

FILE *in = fopen("stramosi.in","r"), *out = fopen("stramosi.out","w");

struct graf
{
    int nod, ordine;
    graf *next;
};

graf *a[maxn] = {NULL};

int n, m;

graf *query[maxn] = {NULL}; // retine intrebarile pt nodul i

int h = 0;
int radacini[maxn]; // retine nodurile care sunt radacini

int raspunsuri[maxm];

int k = 0;
int st[maxn];

void add(int p, int val)
{
    graf *q = new graf;
    q->next = a[p];
    q->nod = val;
    a[p] = q;
}

void add2(int p, int val, int ordine)
{
    graf *q = new graf;
    q->next = query[p];
    q->nod = val;
    q->ordine = ordine;
    query[p] = q;
}

void read()
{
    fscanf(in, "%d %d", &n, &m);

    int t;
    for ( int i = 1; i <= n; ++i )
    {
        fscanf(in, "%d", &t);
        if ( t )
            add(t, i);
        else
            radacini[++h] = i;
    }

    int q, p;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d", &p, &q);
        add2(p, q, i);
    }
}

void df(int nod)
{
    st[++k] = nod;

    while ( query[nod] )
    {
        raspunsuri[query[nod]->ordine] = query[nod]->nod > k ? 0 : st[k - query[nod]->nod];
        query[nod] = query[nod]->next;
    }

    while ( a[nod] )
    {
        df(a[nod]->nod);
        a[nod] = a[nod]->next;
    }

    --k;
}

int main()
{
    read();

    for ( int i = 1; i <= h; ++i )
        df(radacini[i]);

    for ( int i = 1; i <= m; ++i )
        fprintf(out, "%d\n", raspunsuri[i]);

	return 0;
}