Pagini recente » Cod sursa (job #2974961) | Cod sursa (job #2633107) | Cod sursa (job #148406) | Cod sursa (job #2518899) | Cod sursa (job #1418960)
# include <bits/stdc++.h>
using namespace std;
class Reader {
public:
Reader(const string& filename):
m_stream(filename),
m_pos(kBufferSize - 1),
m_buffer(new char[kBufferSize]) {
next();
}
Reader& operator>>(int& value) {
value = 0;
while (current() < '0' || current() > '9')
next();
while (current() >= '0' && current() <= '9') {
value = value * 10 + current() - '0';
next();
}
return *this;
}
private:
const int kBufferSize = 32768;
char current() {
return m_buffer[m_pos];
}
void next() {
if (!(++m_pos != kBufferSize)) {
m_stream.read(m_buffer.get(), kBufferSize);
m_pos = 0;
}
}
ifstream m_stream;
int m_pos;
unique_ptr<char[]> m_buffer;
};
Reader fi("stramosi.in");
int dp[300005][25];
int lg[300005];
int main(void)
{
int n,m;
fi>>n>>m;
freopen("stramosi.out","w",stdout);
for (int i=1;i<=n;++i) fi>>dp[i][0];
for (int i=1;i<=n;++i)
{
int a = dp[i][0],b = 0;
while (a) dp[i][++b] = dp[a][b-1],a = dp[a][b-1];
}
for (int i=2;i<=n;++i) lg[i] = lg[i>>1] + 1;
int x,y;
while (m --)
{
fi>>x>>y;
while (x && y)
{
x = dp[x][lg[y&-y]];
y-=y&-y;
}
printf("%d\n",x);
}
return 0;
}