Cod sursa(job #196079)

Utilizator tvladTataranu Vlad tvlad Data 24 iunie 2008 13:47:58
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <cstdio>

const int N = 250000;
const int lgN = 18;
const int M = 300000;

int n,m;
int p[N];
int s[N][lgN];

int query ( int x, int k ) {
	if (x < 0) return -1;
	if (k == 0)	return x;
	int msb; for (msb = 17; msb && !((1 << msb) & k); --msb);
	if (s[x][msb] == -1)
		return -1; else
		return query(s[x][msb], k & ((1 << 31) - 1 - (1 << msb)));
}

void pre() {
	for (int i = 0; i < n; ++i) s[i][0] = p[i];
	for (int lg = 1; (1 << lg) <= n; ++lg)
		for (int i = 0; i < n; ++i)
			s[i][lg] = query(s[i][0],(1 << lg)-1);
}

int main() {
	freopen("stramosi.in","rt",stdin);
	freopen("stramosi.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0; i < n; ++i) {
		scanf("%d",&p[i]);
		--p[i];
	}
	pre();
	for (int i = 0, a, b; i < m; ++i) {
		scanf("%d %d",&a,&b);
		--a;
		printf("%d\n",query(a,b)+1);
	}
	return 0;
}