Pagini recente » Borderou de evaluare (job #1330584) | Cod sursa (job #1800471) | Borderou de evaluare (job #1694865) | Borderou de evaluare (job #182893) | Cod sursa (job #308062)
Cod sursa(job #308062)
#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();
}