#include using namespace std; typedef long long ll; typedef vector VI; typedef vector VVI; #define REP(i, n) for(int(i)=0;(i)<(n);++(i)) #define FOR(i, f, t) for(int(i)=(f);(i)<(t);(++i)) #define RREP(i, n) for(int(i)=(n)-1;(i)>=0;--(i)) const int MOD = int(1e9+7); struct bitarray{ typedef unsigned long long elem; static const int es = sizeof(elem)*8; elem emask[es+1]; int N,EN; elem *ar; bitarray(int N):N(N){ EN=(N+es-1)/es+1;ar=new elem[EN]; memset(ar,0,EN*sizeof(elem)); for(int i=0;i<=es;i++) emask[i]=(i==es)?-1:((elem)1<=N) throw; int m=n%es;n/=es; ar[n] = (ar[n] & ~((elem)1 << m)) | ((elem)f << m); } inline bool get(int n) const{ if(n>=N) throw; int m=n%es;n/=es; return (ar[n]>>m)&1; } inline elem getblock(int n) const { int m=n%es;n/=es; if(m) return (ar[n]>>m) | (ar[n+1]<<(es-m)); return ar[n]; } inline void setblock(int n, elem v, elem mask = -1){ int m=n%es;n/=es; v &= mask; ar[n] = (ar[n] & ~(mask << m)) | (v << m); if(m) ar[n+1] = (ar[n+1] & ~(mask >> (es-m))) | (v >> (es-m)); } void rangexor(int u, int v, int n){ if(u < v && u+n > v){ const int vend=v+n,uend=u+n; int bv=(vend-1)/es*es,bu=uend-(vend-bv); while(bv>=v){ int bn=min(vend-bv,es); setblock(bv, getblock(bu)^getblock(bv), emask[bn]); bu-=es;bv-=es;n-=bn; } if(n){ setblock(v, getblock(u)^getblock(v), emask[n]); } } else { int l=v-v/es*es,bv=v,bu=u; if(l){ int bn=min(n,es-l); setblock(bv, getblock(bu)^getblock(bv), emask[bn]); bu+=bn;bv+=bn;n-=bn; } while(n){ int bn=min(n,es); setblock(bv, getblock(bu)^getblock(bv), emask[bn]); bu+=bn;bv+=bn;n-=bn; } } } }; int main(){ do { cin.tie(0); ios_base::sync_with_stdio(false); } while(0); int N,Q; ll S,X,Y,Z; cin >> N >> S >> X >> Y >> Z; bitarray ba(N); ll k = S; ba.set(0,k&1); FOR(i,1,N) ba.set(i, (k = ((k*X)%Z+Y) % Z) & 1); cin >> Q; REP(i,Q){ int s,t,u,v; cin >> s >> t >> u >> v; s--,u--; int n = t-s; ba.rangexor(s,u,n); } string res; REP(i,N) res += "EO"[ba.get(i)]; cout << res << endl; return 0; }