結果
| 問題 | No.879 Range Mod 2 Query |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-04-22 14:53:15 |
| 言語 | C++14 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 120 ms / 3,000 ms |
| コード長 | 3,182 bytes |
| 記録 | |
| コンパイル時間 | 971 ms |
| コンパイル使用メモリ | 181,748 KB |
| 実行使用メモリ | 11,264 KB |
| 最終ジャッジ日時 | 2026-04-22 14:53:23 |
| 合計ジャッジ時間 | 3,211 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define sc cerr
#define qlog(x) {sc<<#x<<" = "<<(x)<<"\n";}
#define rep(i,l,r) for(ll i=(l);i<=(r);i++)
#define irep(i,l,r) for(ll i=(l);i>=(r);i--)
#define qloga(a,l,r) {sc<<#a<<" : "; rep(I,l,r){sc<<(a)[I]<<" ";}sc<<"\n";}
#define qlogSTL(a) {sc<<#a<<" : "; for(const auto &I:(a)){sc<<(I)<<" ";}sc<<"\n";}
typedef long long ll;
typedef unsigned long long ull;
constexpr int N=4e5+10;
int n,Q;
namespace ST{
#define ls(u) ((u)<<1)
#define rs(u) ((u)<<1|1)
ll sum[N];
int oddcnt[N];
bool lz1[N],rev[N];
ll lz0[N],lz2[N];
void pushup(int u){
oddcnt[u]=oddcnt[ls(u)]+oddcnt[rs(u)];
sum[u]=sum[ls(u)]+sum[rs(u)];
}
void lazyadd(ll x,int u,int l,int r){
if(lz1[u]){
lz2[u]+=x;
}else{
lz0[u]+=x;
}
if(x&1)oddcnt[u]=(r-l+1)-oddcnt[u];
sum[u]+=x*(r-l+1);
}
void lazyzip(int u,int l,int r){
lz1[u]=1;
lz0[u]^=lz2[u];
lz2[u]=0;
sum[u]=oddcnt[u];
}
int pushdw(int u,int l,int r){
//sc<<lz1[u]<<" "<<lz2[u]<<"\n";
int mid=(l+r)/2;
if(lz0[u]){
lazyadd(lz0[u],ls(u),l,mid);
lazyadd(lz0[u],rs(u),mid+1,r);
lz0[u]=0;
}
if(lz1[u]){
lazyzip(rs(u),l,mid);
lazyzip(ls(u),mid+1,r);
lz1[u]=0;
}
if(lz2[u]){
lazyadd(lz2[u],ls(u),l,mid);
lazyadd(lz2[u],rs(u),mid+1,r);
lz2[u]=0;
}
return mid;
}
void add(int L,int R,ll x,int u=1,int l=1,int r=n){
if(L<=l && r<=R){
lazyadd(x,u,l,r);
return;
}
int mid=pushdw(u,l,r);
if(L<=mid)add(L,R,x,ls(u),l,mid);
if(mid+1<=R)add(L,R,x,rs(u),mid+1,r);
pushup(u);
}
void zip(int L,int R,int u=1,int l=1,int r=n){
if(L<=l && r<=R){
lazyzip(u,l,r);
return;
}
int mid=pushdw(u,l,r);
if(L<=mid)zip(L,R,ls(u),l,mid);
if(mid+1<=R)zip(L,R,rs(u),mid+1,r);
pushup(u);
}
ll query(int L,int R,int u=1,int l=1,int r=n){
if(L<=l && r<=R){
return sum[u];
}
int mid=pushdw(u,l,r);
ll ans=0;
if(L<=mid)ans+=query(L,R,ls(u),l,mid);
if(mid+1<=R)ans+=query(L,R,rs(u),mid+1,r);
return ans;
}
}
namespace BF{
ll a[N];
void add(int l,int r,ll x){
rep(i,l,r)a[i]+=x;
}
void zip(int l,int r){
rep(i,l,r)a[i]=(a[i]&1);
}
ll query(int l,int r){
ll ans=0;
rep(i,l,r)ans+=a[i];
return ans;
}
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0);
using namespace ST;
//using namespace BF;
cin>>n>>Q;
rep(i,1,n){
ll x;
cin>>x;
add(i,i,x);
}
while(Q--){
int opt,l,r;
cin>>opt>>l>>r;
//rep(i,1,n){cout<<query(i,i)<<" ";} cout<<"\n";
if(opt==2){
ll x; cin>>x;
add(l,r,x);
}else if(opt==1){
zip(l,r);
}else{
cout<<query(l,r)<<"\n";
}
}
}
vjudge1