Pagini recente » Cod sursa (job #296006) | Cod sursa (job #607869) | Cod sursa (job #1882983) | Cod sursa (job #1053695) | Cod sursa (job #306516)
Cod sursa(job #306516)
#include <fstream>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NMAX = 250002;
//const int MMAX = 300000;
struct adl_el {
int *sons, *queries;
} adl[NMAX];
int s[NMAX];
int main()
{
ifstream fin("stramosi.in"); ofstream fout("stramosi.out");
int N, M, k, nrq = 0, i, node, dsl;
int *dfs, *q, *p, *df;
fin >> N >> M;
dfs = new int [N]; df = new int [N]; q = new int [M]; p = new int [M];
for (i = 1; i <= N; ++i) {
fin >> df[i];
s[df[i]]++;
}
for (i = 1; i <= N; ++i) {
adl_el &cl = adl[df[i]];
if (!cl.sons) {
cl.sons = new int [ s[df[i]] + 1 ];
cl.sons[ s[df[i]] ] = 0;
s[ df[i] ] = 0;
}
cl.sons[ s[df[i]]++ ] = i;
}
memset(s, 0, sizeof(s));
for (i = 1; i <= M; ++i) {
fin >> q[i] >> p[i];
s[q[i]]++;
}
for (i = 1; i <= M; ++i) {
adl_el &cl = adl[q[i]];
if (!cl.queries) {
cl.queries = new int [ s[q[i]] + 1 ];
cl.queries[ s[q[i]] ] = 0;
s[q[i]] = 0;
}
cl.queries[ s[q[i]]++ ] = p[i];
}
dfs[1] = 0;
dsl = 1;
while (dsl && nrq <= M) {
adl_el &cl = adl[node = dfs[dsl]];
if (cl.queries) {
while ( *cl.queries ) {
nrq++;
k = *cl.queries;
*(cl.queries++) = k > dsl - 2 ? 0 : dfs[dsl - k];
}
}
if (cl.sons) {
if (!(*cl.sons)) {
cl.sons = 0;
dsl--;
}
else dfs[++dsl] = *(cl.sons++);
}
else dsl--;
}
for (i = 1; i <= M; ++i) { fout << *(adl[q[i]].queries - s[q[i]]--) << endl; }
}