Pagini recente » Cod sursa (job #1824847) | Cod sursa (job #1634244) | Cod sursa (job #1049266) | Cod sursa (job #113295) | Cod sursa (job #2589699)
#include <fstream>
#include <map>
#include <vector>
#include <bitset>
#pragma warning(disable:4996)
#define x first
#define y second
using namespace std;
class InParser
{
private:
FILE* fin;
char* buff;
int sp;
char read()
{
++sp;
if (sp == 4096)
{
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume)
{
sp = 4095;
fin = fopen(nume, "r");
buff = new char[4096];
}
InParser& operator >> (int& n)
{
char c;
while (!isdigit(c = read()));
n = c - '0';
while (isdigit(c = read()))
n = n * 10 + c - '0';
return *this;
}
};
InParser fin("stramosi.in");
ofstream fout("stramosi.out");
const int NMAX = 250003;
typedef pair <int, int> p;
vector <int> g[NMAX];
vector <int> q[NMAX];
vector <int> rad;
map<p, int> r;
vector <p> query;
int n, m, a, b;
vector <int> st;
void DFS(int nod)
{
st.push_back(nod);
for (size_t i = 0; i < g[nod].size(); ++i)
{
int fiu = g[nod][i];
for (size_t j = 0; j < q[fiu].size(); ++j)
{
int str = q[fiu][j];
if (str == 0) r.insert({ {fiu, str}, fiu });
else if (str <= st.size())
r.insert({ {fiu, str}, st[st.size() - str] });
else r.insert({ {fiu, str}, 0 });
}
DFS(fiu);
}
st.pop_back();
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
fin >> a;
if (a == 0) rad.push_back(i);
else g[a].push_back(i);
}
query.resize(m);
for (int i = 0; i < m; ++i)
{
fin >> query[i].x >> query[i].y;
q[query[i].x].push_back(query[i].y);
}
for (size_t i = 0; i < rad.size(); ++i)
DFS(rad[i]);
for (int i = 0; i < m; ++i)
fout << r[query[i]] << "\n";
return 0;
}