#include #include using namespace std; using namespace atcoder; #define rep(i, n) REP(i, 0, n) #define REP(i, s, e) for (ll i = (s); i < (ll)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for (ll i = (ll)(s - 1); i >= (ll)(e); i--) #define all(r) r.begin(), r.end() #define rall(r) r.rbegin(), r.rend() typedef long long ll; typedef vector vi; typedef vector vl; template bool chmax(T& a, const U& b) { if (a >= b) return false; a = b; return true; } template bool chmin(T& a, const U& b) { if (a <= b) return false; a = b; return true; } void solve() { ll n, s, x, y, z; cin >> n >> s >> x >> y >> z; // bitsetの代わりにuint64_tの配列を用意(はみ出し防止で多めに確保) int words = (n + 128) / 64; vector a(words, 0); { vl b(n); b[0] = s; REP(i, 1, n) { b[i] = (x * b[i - 1] + y) % z; } // 初期状態のビットセット rep(i, n) { if (b[i] & 1) { a[i / 64] |= (1ULL << (i % 64)); } } } int q; cin >> q; // 退避用のバッファ(メモリ再確保を省くため外に置く) vector temp(words, 0); rep(qi, q) { int S, T, U, V; cin >> S >> T >> U >> V; --S; --U; int len = T - S; if (len <= 0) continue; int temp_words = (len + 63) / 64; int src_word = S / 64; int src_shift = S % 64; int inv_shift = 64 - src_shift; // 1. 必要な区間(S ~ T)のビットだけを抽出してtempにコピー for (int i = 0; i < temp_words; i++) { uint64_t val = (a[src_word + i] >> src_shift); // 次のwordにまたがるビットを補完 (64bitシフトはUBになるため src_shift != 0 でガード) if (src_shift != 0 && src_word + i + 1 < (int)a.size()) { val |= (a[src_word + i + 1] << inv_shift); } temp[i] = val; } int dst_word = U / 64; int dst_shift = U % 64; int dst_inv = 64 - dst_shift; int bits_left = len; // 2. 抽出したビットをUからの位置にXORする for (int i = 0; i < temp_words && bits_left > 0; i++) { int bits_this_word = min(bits_left, 64); // 必要なビット数だけ残すマスクを作成 (1ULL << 64対策) uint64_t mask = (bits_this_word == 64) ? ~0ULL : ((1ULL << bits_this_word) - 1); uint64_t val = temp[i] & mask; a[dst_word + i] ^= (val << dst_shift); if (dst_shift != 0 && dst_word + i + 1 < (int)a.size()) { a[dst_word + i + 1] ^= (val >> dst_inv); } bits_left -= 64; } } rep(i, n) { if ((a[i / 64] >> (i % 64)) & 1) cout << 'O'; else cout << 'E'; } cout << '\n'; } int main() { cin.tie(0); ios::sync_with_stdio(false); int t = 1; // cin >> t; rep(ti, t) solve(); return 0; }