#include #include #include #include // O(NQ) 解法 [[nodiscard]] static inline constexpr std::string solve([[maybe_unused]] const int_fast32_t N, const int_fast32_t Q, const std::string& S, std::vector& T, std::vector& X) noexcept { std::string ans(Q, '?'); for (int_fast32_t i = 0; i != Q; ++i) { --X[i]; // 1-indexed → 0-indexed T[i] = std::min(T[i], 60); // T[i] が 60 より大きい場合を考慮する必要はない(解説参照) const char* target = S.data(); int_fast32_t cursor = 0; for (; X[i] != 0; --T[i]) { for (cursor = 0; X[i] != 0; ++cursor) { if (target[cursor] != 'w' && target[cursor] != 'a') [[likely]] --X[i]; else if (X[i] < 5 * (INT64_C(1) << T[i]) - 4) [[unlikely]] { if (target[cursor] == 'a') target = "answer"; else if (target[cursor] == 'w') target = "warong"; else [[unlikely]] return "!!! Error !!!"; // 異常終了 break; } else X[i] -= 5 * (INT64_C(1) << T[i]) - 4; } } ans[i] = target[cursor]; } return ans; } int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); int_fast32_t N, Q, i; std::string S; std::cin >> N >> Q; S.reserve(N), std::cin >> S; std::vector T(Q), X(Q); for (i = 0; i != Q; ++i) std::cin >> T[i] >> X[i]; std::cout << solve(N, Q, S, T, X) << '\n'; return 0; }