Pagini recente » Cod sursa (job #1874455) | Cod sursa (job #2186555) | Cod sursa (job #2123134) | Cod sursa (job #488985) | Cod sursa (job #811537)
Cod sursa(job #811537)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
#define FORIT(it, v) for (typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
const int N = 250005;
const int M = 300005;
int n, m;
int x[M], y, poz[N];
int st[N], head;
bool vis[N];
vector <int> graph[N];
vector <int> query[N];
vector <int> sol[N];
void read() {
f >> n >> m;
for (int i = 1; i <= n; ++i) {
int a;
f >> a;
graph[i].push_back(a);
graph[a].push_back(i);
}
for (int i = 1; i <= m; ++i) {
f >> x[i] >> y;
query[x[i]].push_back(y);
}
}
void dfs(int node) {
vis[node] = true;
FORIT(it, query[node]) {
if (head - *it + 1 <= 0)
sol[node].push_back(0);
else
sol[node].push_back(st[head - *it + 1]);
}
st[++head] = node;
FORIT(it, graph[node]) {
if (!vis[*it])
dfs(*it);
}
--head;
}
int root() {
return 0;
}
void write() {
for (int i = 1; i <= m; ++i) {
g << sol[x[i]][poz[x[i]]] << "\n";
++poz[x[i]];
}
}
int main() {
read();
dfs(root());
write();
}