Pagini recente » Cod sursa (job #1355729) | Cod sursa (job #1179048) | Cod sursa (job #1254994) | Cod sursa (job #1194009) | Cod sursa (job #811547)
Cod sursa(job #811547)
#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 = 350005;
const int M = 400005;
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;
}
/*void dfs(int node) {
df[++dfhead] = node;
while (dfhead > 0) {
st[++head] = df[dfhead];
FORIT(it, graph[df[dfhead]]) {
if (!vis[*it]) {
df[++dfhead] = *it;
break;
}
--dfhead;
}
}
}*/
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();
}