Pagini recente » Cod sursa (job #1915650) | Cod sursa (job #663693) | Cod sursa (job #1145978) | Cod sursa (job #1142346) | Cod sursa (job #307800)
Cod sursa(job #307800)
#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();
}