Cod sursa(job #306547)

Utilizator Omega91Nicodei Eduard Omega91 Data 21 aprilie 2009 12:04:27
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

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

class queue {
	vector<int> el;
	unsigned int first;
	public:
		void push(int x) { el.push_back(x); }
		int pop() { return el[first++]; }
		bool empty() { return first == el.size(); }
} *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;
    fin >> N >> M;
    adl = new queue[N + 2];
    queries = new queue[N + 2];
    ans = new queue[N + 2];
    dfs = new int [N + 2]; q = new int [M + 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);
    }
    dfs[1] = 0;
    dsl = 1;
    while (nrq != M) {
    	assert(dsl);
    	node = dfs[dsl];
        while (!queries[node].empty()) {
			nrq++;
			k = queries[node].pop();
			ans[node].push(k > dsl - 2 ? 0 : dfs[dsl - k]);
        }
        if (!adl[node].empty()) dfs[++dsl] = adl[node].pop();
        else dsl--;
    }
    
    for (i = 1; i <= M; ++i) { fout << ans[q[i]].pop() << endl; }
    fout.close();
}