Cod sursa(job #1114375)

Utilizator SmarandaMaria Pandele Smaranda Data 21 februarie 2014 16:13:38
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <cstdio>
#include <vector>

using namespace std;

const long SIZE = 8000000;

class myIfstream {
	public :
		myIfstream ();
		myIfstream (const char *input_name) {
			input = fopen (input_name, "r");
			cursor = 0;
			fread (buffer, SIZE, 1, input);
		}
		inline myIfstream &operator >> (long&  x) {
			while (buffer [cursor] < '0' || buffer [cursor] > '9')
					advance ();
			x = 0;
			while (buffer [cursor] >= '0' && buffer [cursor] <= '9') {
				x = x * 10 + buffer [cursor] - '0';
				advance ();
			}
			return  *this;
		}
	private :
		FILE *input;
		char buffer [SIZE];
		long cursor;
		void advance () {
			++ cursor;
			if (cursor == SIZE) {
				cursor = 0;
				fread (buffer, SIZE, 1, input);
			}
		}
};

myIfstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

const long N = 250001;
long n, m, s [N], dp [20][250001], lg [20], lg2 [N];

void read () {
	long i;
	fin >> n >> m;
	for (i = 1; i <= n; i ++) {
		fin >> s [i];
		dp [0][i] = s [i];
	}
	lg [0] = 1;
	for (i = 1; i <= 17; i ++) {
		lg [i] = lg [i - 1] << 1;
		lg2 [lg [i]] = i;
	}
}

void solve () {
	long i, j, p2 = 1;
	for (i = 1; ; i ++) {
		p2 = p2 << 1;
		if (p2 > n)
			break;
		for (j = 1; j <= n; j ++)
			dp [i][j] = dp [i - 1][dp [i - 1][j]];
	}
}

long query (long a, long b)  {
	long i, p, p2;
	if ((b & (b - 1)) == 0) {
			p = lg2 [b];
		return dp [p][a];
	}
	for (p2 = 1; p2 < b; p2 <<= 1);
	p2 >>= 1;
	p = lg2 [p2];
	return query (dp [p][a], b - p2);
}

int main () {
	long i, a, b;
	read ();
	solve ();
	for (i = 1; i<= m; i ++) {
		fin >> a >> b;
		fout << query (a, b) << "\n";
	}
	return 0;
}