Pagini recente » Cod sursa (job #905786) | Cod sursa (job #344505) | Cod sursa (job #2092599) | Cod sursa (job #470432) | Cod sursa (job #695626)
Cod sursa(job #695626)
#include<fstream>
#include<vector>
#include<algorithm>
#define infile "stramosi.in"
#define outfile "stramosi.out"
#define n_max 250005
#define log_max 18
#define pb push_back
#define idx (*it).second
#define INF 1<<30
#define FOR(g) \
for(vector < int > ::iterator it=g.begin(); it!=g.end(); ++it)
using namespace std;
int P[n_max][log_max];
int N, M;
int LCA(int p, int q)
{
int nr, x, y;
while(q){
nr = 1;
y = 0;
while(2 * nr <= q)
nr<<=1, y++;
x = P[p][y];
p = x;
q -= nr;
}
return x;
}
int main()
{
freopen(infile, "r", stdin);
freopen(outfile, "w", stdout);
scanf("%d %d", &N, &M);
int x, p;
for(int i=1; i<=N; ++i)
scanf("%d", &P[i][0]);
for(int i=1; i<=N; ++i)
for(int j=1; (1<<j)<=N; ++j)
P[i][j] = P[ P[i][j-1] ][j-1];
while(M--){
scanf("%d %d", &x, &p);
printf("%d\n", LCA(x, p));
}
fclose(stdin);
fclose(stdout);
return 0;
}