Cod sursa(job #308062)

Utilizator Omega91Nicodei Eduard Omega91 Data 25 aprilie 2009 22:17:18
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;

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

class queue {
	struct q_el {
        int data;
        q_el *next;
    } *first, *last;
	public:
        queue() { first = 0; };
		void push(int x)
        {
            if (!first) last  = first = new q_el;
            else last = last -> next = new q_el;
            last -> data = x;
            last -> next = 0;
        };
		int pop()
        {
            int aux = first -> data;
            first = first -> next;
            return aux;
        };
		bool empty() { return !first; } ;
} *adl, *queries, *ans;

int s[NMAX];

int main()
{
    ifstream fin("stramosi.in"); ofstream fout("stramosi.out");
    int N, M, k, nrq = 0, i, node, dsl, aux;
    int *dfs, *q, p, **lastgood, *dfsstart;
    fin >> N >> M;
    adl = new queue[N + 2];
    queries = new queue[N + 2];
    ans = new queue[N + 2];
    dfsstart = dfs = new int [N + 2]; q = new int [M + 2];
    lastgood = new int* [N + 2];

    for (i = 1; i <= N; ++i) {
        fin >> aux;
        adl[aux].push(i);
    }
    for (i = 1; i <= M; ++i) {
        fin >> q[i] >> p;
       	queries[q[i]].push(p);
    }
    *lastgood = dfs;
    *dfs = 0;
    check:
        node = *dfs;
        while (!queries[node].empty()) {
			nrq++;
			dsl = dfs - dfsstart;
			k = queries[node].pop();
			ans[node].push(k > dsl - 1 ? 0 : *(dfs - k));
        }
        neigh:
            if (nrq == M) goto end;
            node = *dfs;
            if (!adl[node].empty()) {
                *(++dfs) = adl[node].pop();
                if (!adl[node].empty()) *(++lastgood) = dfs - 1;
                goto check;
            }
            else {
                dfs = (dfs == *lastgood ? *(--lastgood) : *lastgood);
                goto neigh;
            }
    
    end:
    for (i = 1; i <= M; ++i) { fout << ans[q[i]].pop() << endl; }
    fout.close();
}