Pagini recente » Rating Avadanei Antonia (antonia.avadanei) | Cod sursa (job #832884) | Cod sursa (job #987189) | Cod sursa (job #1998968)
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define sz size
#define pb push_back
#define mp make_pair
#define bg begin
#define all(x) x.begin(),x.end()
using namespace std;
// #define int long long
const int maxn = 250003;
const int maxk = 1003;
int dp[20][maxn];
int n,m;
int tree[maxn];
int x,y;
//Precondition x!=0
//Returns highestbit + 1
int highestbit(int z){
int res = 31;
while(!((1 << res) & z)) res--;
return res;
}
void preproc(){
int mx = highestbit(n) + 1;
for(int i=0;i<=n;i++){
for(int j=0;j<20;j++){
dp[j][i] = -1;
}
}
for(int i=1;i<=n;i++){
dp[0][i] = tree[i];
}
for(int k=1;k<mx;k++){
for(int i=1;i<=n;i++){
if(dp[k-1][i]!=-1){
dp[k][i] = dp[k-1][dp[k-1][i]];
}
}
}
// for(int i=0;i<4;i++){
// for(int j=0;j<=n;j++){
// cout << dp[i][j] << ' ';
// }
// cout << '\n';
// }
}
int query(int node,int stramos){
if(stramos > n) return 0;
int curr = node;
// cout << curr << ' ';
for(int l = 30;l>=0;l--){
if(((1 << l) & stramos)){
curr = dp[l][curr];
// cout << curr << ' ';
if(curr == -1) return curr;
}
}
// cout << ' ' << '\n';
return curr;
}
int32_t main(){
// #ifndef ONLINE_JUDGE
// freopen("input.in","r",stdin);
// #endif
// ios_base::sync_with_stdio(false);
// ifstream fin("stramosi.in");
// ofstream fout("stramosi.out");
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d",&n,&m);
// fin >> n >>m;
for(int i=1;i<=n;i++){
// fin >> x;
scanf("%d",&x);
tree[i] = x;
}
// cout << "PRUNEEEE" << '\n';
preproc();
for(int i=0;i<m;i++){
// fin >> x >> y;
scanf("%d %d",&x,&y);
int ans = query(x,y);
// fout << (ans==-1 ? 0 : ans) << '\n';
int blabla = (ans==-1 ? 0 : ans);
printf("%d\n",blabla);
}
return 0;
}