using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.IO; using System.Text; using System.Diagnostics; using static util; using P = pair; using Binary = System.Func; using Unary = System.Func; class Program { static StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }; static Scan sc = new Scan(); const int M = 1000000007; // const int M = 998244353; const long LM = (long)1e18; const double eps = 1e-11; static readonly int[] dd = { 0, 1, 0, -1, 0 }; static void Main(string[] args) { int n; long s, x, y, z; sc.Multi(out n, out s, out x, out y, out z); var bs = new Bitset(n); long a = s; bs[0] = (a & 1) == 1; for (int i = 1; i < n; i++) { a = (a * x + y) % z; bs[i] = (a & 1) == 1; } int q = sc.Int; for (int i = 0; i < q; i++) { int l1, r1, l2, r2; sc.Multi(out l1, out r1, out l2, out r2); --l1; --l2; bs.XOR(bs.getSubset(l1, r1), l2); } Prt(bs.ToString('O', 'E')); sw.Flush(); } static void DBG(string a) => Console.WriteLine(a); static void DBG(IEnumerable a) => DBG(string.Join(" ", a)); static void DBG(params object[] a) => DBG(string.Join(" ", a)); static void Prt(string a) => sw.WriteLine(a); static void Prt(IEnumerable a) => Prt(string.Join(" ", a)); static void Prt(params object[] a) => Prt(string.Join(" ", a)); } class pair : IComparable> where T : IComparable where U : IComparable { public T v1; public U v2; public pair(T v1, U v2) { this.v1 = v1; this.v2 = v2; } public int CompareTo(pair a) => v1.CompareTo(a.v1) != 0 ? v1.CompareTo(a.v1) : v2.CompareTo(a.v2); public override string ToString() => v1 + " " + v2; } static class util { public static pair make_pair(this IList l) where T : IComparable => make_pair(l[0], l[1]); public static pair make_pair(T v1, U v2) where T : IComparable where U : IComparable => new pair(v1, v2); public static T sqr(T a) => Operator.Multiply(a, a); public static T Max(params T[] a) => a.Max(); public static T Min(params T[] a) => a.Min(); public static bool inside(int i, int j, int h, int w) => i >= 0 && i < h && j >= 0 && j < w; public static void swap(ref T a, ref T b) { var t = a; a = b; b = t; } public static void swap(this IList a, int i, int j) { var t = a[i]; a[i] = a[j]; a[j] = t; } public static T[] copy(this IList a) { var ret = new T[a.Count]; for (int i = 0; i < a.Count; i++) ret[i] = a[i]; return ret; } } static class Operator { static readonly ParameterExpression x = Expression.Parameter(typeof(T), "x"); static readonly ParameterExpression y = Expression.Parameter(typeof(T), "y"); public static readonly Func Add = Lambda(Expression.Add); public static readonly Func Subtract = Lambda(Expression.Subtract); public static readonly Func Multiply = Lambda(Expression.Multiply); public static readonly Func Divide = Lambda(Expression.Divide); public static readonly Func Plus = Lambda(Expression.UnaryPlus); public static readonly Func Negate = Lambda(Expression.Negate); public static Func Lambda(Binary op) => Expression.Lambda>(op(x, y), x, y).Compile(); public static Func Lambda(Unary op) => Expression.Lambda>(op(x), x).Compile(); } class Scan { public int Int => int.Parse(Str); public long Long => long.Parse(Str); public double Double => double.Parse(Str); public string Str => Console.ReadLine().Trim(); public pair Pair() where T : IComparable where U : IComparable { T a; U b; Multi(out a, out b); return make_pair(a, b); } public int[] IntArr => StrArr.Select(int.Parse).ToArray(); public long[] LongArr => StrArr.Select(long.Parse).ToArray(); public double[] DoubleArr => StrArr.Select(double.Parse).ToArray(); public string[] StrArr => Str.Split(new []{' '}, System.StringSplitOptions.RemoveEmptyEntries); bool eq() => typeof(T).Equals(typeof(U)); T ct(U a) => (T)Convert.ChangeType(a, typeof(T)); T cv(string s) => eq() ? ct(int.Parse(s)) : eq() ? ct(long.Parse(s)) : eq() ? ct(double.Parse(s)) : eq() ? ct(s[0]) : ct(s); public void Multi(out T a) => a = cv(Str); public void Multi(out T a, out U b) { var ar = StrArr; a = cv(ar[0]); b = cv(ar[1]); } public void Multi(out T a, out U b, out V c) { var ar = StrArr; a = cv(ar[0]); b = cv(ar[1]); c = cv(ar[2]); } public void Multi(out T a, out U b, out V c, out W d) { var ar = StrArr; a = cv(ar[0]); b = cv(ar[1]); c = cv(ar[2]); d = cv(ar[3]); } public void Multi(out T a, out U b, out V c, out W d, out X e) { var ar = StrArr; a = cv(ar[0]); b = cv(ar[1]); c = cv(ar[2]); d = cv(ar[3]); e = cv(ar[4]); } public void Multi(out T a, out U b, out V c, out W d, out X e, out Y f) { var ar = StrArr; a = cv(ar[0]); b = cv(ar[1]); c = cv(ar[2]); d = cv(ar[3]); e = cv(ar[4]); f = cv(ar[5]); } } class Bitset { int size, m64; ulong b64; ulong[] bits; public Bitset(int n) { size = n; bits = new ulong[(n + 63) >> 6]; m64 = size & 63; b64 = (1UL << m64) - 1UL; } public Bitset(IList b) : this(b.Count) { for (int i = 0; i < size; i++) this[i] = b[i]; } public void fill(bool b) { for (int i = 0; i < bits.Length; i++) bits[i] = b ? ulong.MaxValue : 0; trim(); } public bool this[int i] { set { if (value) bits[i >> 6] |= 1UL << (i & 63); else bits[i >> 6] &= ~(1UL << (i & 63)); } get { return (bits[i >> 6] >> (i & 63) & 1) == 1; } } void trim() { if (m64 > 0) bits[bits.Length - 1] &= b64; } public static Bitset operator&(Bitset a, Bitset b) { var ret = new Bitset(a.size); for (int i = 0; i < ret.bits.Length; i++) ret.bits[i] = a.bits[i] & b.bits[i]; return ret; } public static Bitset operator|(Bitset a, Bitset b) { var ret = new Bitset(a.size); for (int i = 0; i < ret.bits.Length; i++) ret.bits[i] = a.bits[i] | b.bits[i]; return ret; } public static Bitset operator^(Bitset a, Bitset b) { var ret = new Bitset(a.size); for (int i = 0; i < ret.bits.Length; i++) ret.bits[i] = a.bits[i] ^ b.bits[i]; return ret; } public static Bitset operator<<(Bitset a, int k) { if (k < 0) return a >> -k; var ret = new Bitset(a.size); for (int i = k >> 6; i < ret.bits.Length; i++) ret.bits[i] = a.bits[i - (k >> 6)] << (k & 63) | (i > (k >> 6) && (k & 63) != 0 ? a.bits[i - 1 - (k >> 6)] >> 64 - (k & 63) : 0); ret.trim(); return ret; } public static Bitset operator>>(Bitset a, int k) { if (k < 0) return a << -k; var ret = new Bitset(a.size); for (int i = 0; i + (k >> 6) < ret.bits.Length; i++) ret.bits[i] = a.bits[i + (k >> 6)] >> (k & 63) | (i + (k >> 6) < ret.bits.Length - 1 && (k & 63) != 0 ? a.bits[i + 1 + (k >> 6)] << 64 - (k & 63) : 0); return ret; } public Bitset Lrotate(int k) => this << k | this >> (size - k); public Bitset Rrotate(int k) => this >> k | this << (size - k); public Bitset getSubset(int l, int r) { var ret = new Bitset(r - l); for (int i = 0; i < ret.bits.Length; i++) ret.bits[i] = bits[i + (l >> 6)] >> (l & 63) | (i + (l >> 6) < bits.Length - 1 && (l & 63) != 0 ? bits[i + 1 + (l >> 6)] << 64 - (l & 63) : 0); ret.trim(); return ret; } public void XOR(Bitset sub, int ofst) { for (int i = 0; i < sub.bits.Length; i++) bits[i + (ofst >> 6)] ^= sub.bits[i] << (ofst & 63) | (i > 0 && (ofst & 63) != 0 ? sub.bits[i - 1] >> 64 - (ofst & 63) : 0); if ((ofst & 63) != 0 && sub.bits.Length + (ofst >> 6) < bits.Length) bits[sub.bits.Length + (ofst >> 6)] ^= sub.bits[sub.bits.Length - 1] >> 64 - (ofst & 63); } public bool[] ToBoolean() { var ret = new bool[size]; for (int i = 0; i < size; i++) ret[i] = this[i]; return ret; } public override string ToString() { var sb = new StringBuilder(); for (int i = 0; i < size; i++) sb.Append(this[i] ? 1 : 0); return sb.ToString(); } public string ToString(char T, char F) { var sb = new StringBuilder(); for (int i = 0; i < size; i++) sb.Append(this[i] ? T : F); return sb.ToString(); } }