Cod sursa(job #306516)

Utilizator Omega91Nicodei Eduard Omega91 Data 21 aprilie 2009 09:46:17
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int NMAX = 250002;
//const int MMAX = 300000;

struct adl_el {
    int *sons, *queries;
} adl[NMAX];

int s[NMAX];

int main()
{
    ifstream fin("stramosi.in"); ofstream fout("stramosi.out");
    int N, M, k, nrq = 0, i, node, dsl;
    int *dfs, *q, *p, *df;
    fin >> N >> M;
    dfs = new int [N]; df = new int [N]; q = new int [M]; p = new int [M];
    for (i = 1; i <= N; ++i) {
        fin >> df[i];
        s[df[i]]++;
    }
    for (i = 1; i <= N; ++i) {
        adl_el &cl = adl[df[i]];
        if (!cl.sons) {
            cl.sons = new int [ s[df[i]] + 1 ];
            cl.sons[ s[df[i]] ] = 0;
            s[ df[i] ] = 0;
        }
        cl.sons[ s[df[i]]++ ] = i;
    }
    memset(s, 0, sizeof(s));
    for (i = 1; i <= M; ++i) {
        fin >> q[i] >> p[i];
        s[q[i]]++;
    }
    for (i = 1; i <= M; ++i) {
        adl_el &cl = adl[q[i]];
        if (!cl.queries) {
            cl.queries = new int [ s[q[i]] + 1 ];
            cl.queries[ s[q[i]] ] = 0;
            s[q[i]] = 0;
        }
        cl.queries[ s[q[i]]++ ] = p[i];
    }
    dfs[1] = 0;
    dsl = 1;
    
    while (dsl && nrq <= M) {
        adl_el &cl = adl[node = dfs[dsl]];
        if (cl.queries) {
            while ( *cl.queries ) {
                nrq++;
                k = *cl.queries;
                *(cl.queries++) = k > dsl - 2 ? 0 : dfs[dsl - k];
            }
        }
        
        if (cl.sons) {
            if (!(*cl.sons)) {
                cl.sons = 0;
                dsl--;
            }
            else dfs[++dsl] = *(cl.sons++);
            
        }
        else dsl--;
    }
    
    for (i = 1; i <= M; ++i) { fout << *(adl[q[i]].queries - s[q[i]]--) << endl; }
}