Pagini recente » Cod sursa (job #2496976) | Cod sursa (job #1971390) | Cod sursa (job #1164331) | Cod sursa (job #1623250) | Cod sursa (job #306547)
Cod sursa(job #306547)
#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();
}