Cod sursa(job #1998967)

Utilizator brczBereczki Norbert Cristian brcz Data 9 iulie 2017 20:13:15
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#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("sramosi.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;
}