結果
問題 | No.142 単なる配列の操作に関する実装問題 |
ユーザー |
|
提出日時 | 2015-02-02 19:48:24 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1,571 ms / 5,000 ms |
コード長 | 2,642 bytes |
コンパイル時間 | 1,252 ms |
コンパイル使用メモリ | 161,256 KB |
実行使用メモリ | 7,328 KB |
最終ジャッジ日時 | 2024-06-23 06:40:43 |
合計ジャッジ時間 | 7,369 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 5 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef vector<int> VI;typedef vector<VI> 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<<i)-1;}inline void set(int n, bool f){if(n>=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;}