Cod sursa(job #2891749)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 19 aprilie 2022 18:29:11
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

using namespace std;
// using namespace __gnu_pbds;
// template<typename T>
// using oset = tree<T, null_type, less<T>,
				  // rb_tree_tag, tree_order_statistics_node_update>;

#define nl cout.put('\n')
using ll = long long;
using ull = unsigned long long;

#ifdef Wi_TEST
	template<typename T1, typename T2>
	ostream& operator<<(ostream& out, pair<T1,T2> p) {
		out << "(" << p.first << ", " << p.second << ")";
		out.flush(); return out;
	}
	void DEB() { cerr << "]" << endl; }
	template<typename H, typename ... T>
	void DEB(H h, T... t) {
		cerr << h;
		if(sizeof...(t)) cerr << ", ";
		DEB(t...);
	}
	#define deb(...) cerr << "LINE(" << __LINE__ << ") -> [" << \
						     #__VA_ARGS__ << "]: [", DEB(__VA_ARGS__)
#else
	#define deb(...) 87105
#endif

#define QIN_T_LIMIT 4096

struct qin_t {
private:
	FILE *fin;
	char buffer[QIN_T_LIMIT];
	int sp;
public:
	qin_t(const char *nume_fisier) {
		fin = fopen(nume_fisier, "r");
		sp = QIN_T_LIMIT - 1;
	}
	
	~qin_t() {
		fclose(fin);
	}
	
	const char read_ch() {
		++sp;
		if (sp == QIN_T_LIMIT) {
			sp = 0;
			fread(buffer, 1, 4096, fin);
		}
		return buffer[sp];
	}
	
	qin_t& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch()))
			n = 10 * n + c - '0';
		n *= sgn;
		return (*this);
	}
};

const long long MOD = 1000000007, MOD2 = 998244353;
int lx[] = {0, 1, 0, -1}, ly[] = {1, 0, -1, 0};

#define N 250005

int n, m, dp[N][19], q, p;

void solve() {
	qin_t fin("stramosi.in");
	ofstream fout("stramosi.out");
	
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
		fin >> dp[i][0];
	for (int j = 1; j <= 18; ++j)
		for (int i = 1; i <= n; ++i)
			dp[i][j] = dp[dp[i][j-1]][j-1];
	
	for (int i = 0; i < m; ++i) {
		fin >> q >> p;
		int rez = q;
		for (int r = 0; p; p >>= 1, ++r)
			if (p & 1)
				rez = dp[rez][r];
		fout << rez << '\n';
	}
}

int main() {
	ios_base::sync_with_stdio(false);
#ifndef Wi_TEST
	cin.tie(0);
#endif
	
	int t = 1;
	// cin >> t;
	for(int i = 1; i <= t; ++i) {
		solve();
	}
}