Cod sursa(job #307800)

Utilizator Omega91Nicodei Eduard Omega91 Data 24 aprilie 2009 23:33:11
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 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:
		queue() : first(0) {};
		void push(int x) { el.push_back(x); }
		int pop() { return el[first++]; }
		bool empty() { return first == el.size(); }
		int size() { return el.size() - 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;
    while (nrq != M) {
    	node = *dfs;
        while (!queries[node].empty()) {
			nrq++;
			dsl = dfs - dfsstart;
			k = queries[node].pop();
			ans[node].push(k > dsl - 1 ? 0 : *(dfs - k));
        }
		switch (adl[node].size()) {
			case 0: dfs = *(lastgood--); break;
			case 1: *(++dfs) = adl[node].pop(); break;
			default:
                *(++lastgood) = dfs;
				*(++dfs) = adl[node].pop();
				break;
		}
    }

    for (i = 1; i <= M; ++i) { fout << ans[q[i]].pop() << endl; }
    fout.close();
}