rt……对着这代码愣了一小时了
评测状态:10pts(#2 AC,其余全部 WA)
//Luogu-P3870
//Luogu @Enterpr1se (Userid 363523)
//@_Qijia (Userid 363524) AK IOI!
#include<cstdio>
#include<cstring>
#include<cmath>
#define regll register long long
#define regint register int
#define regshort register short
#define _Qijia using
#define AK namespace
#define IOI std
_Qijia AK IOI;
int n,m,a,b,c;
int min(int a,int b){
return a<b?a:b;
}
struct block{
int val,lzt;
};
struct Partition{
block f[100005];
int bls,blkno[100005],lsta[100005];
Partition(){
memset(lsta,0,sizeof(lsta));
}
void build(int r){
bls=sqrt(r);
for(regint i=1;i<=r/bls+1;++i) f[i]={0,0};
for(regint i=1;i<=r;++i) blkno[i]=(i-1)/bls+1;
return;
}
inline void update(int s,int e){
int blk1end=min(blkno[s]*bls,e);
for(regint i=s;i<=blk1end;++i)
f[blkno[s]].val-=lsta[i]^f[blkno[s]].lzt,lsta[i]^=1,f[blkno[s]].val+=lsta[i]^f[blkno[s]].lzt;
if(blkno[s]==blkno[e]) return;
for(regint i=blkno[s]+1;i<blkno[e];++i)
f[i].val=bls-f[i].val,f[i].lzt^=1;
for(regint i=(blkno[e]-1)*bls+1;i<=e;++i)
f[blkno[e]].val-=lsta[i]^f[blkno[e]].lzt,lsta[i]^=1,f[blkno[e]].val+=lsta[i]^f[blkno[e]].lzt;
return;
}
inline int query(int s,int e){
int ret=0,blk1end=min(blkno[s]*bls,e);
for(regint i=s;i<=blk1end;++i)
ret+=lsta[i]^f[blkno[s]].lzt;
if(blkno[s]==blkno[e]) return ret;
for(regint i=blkno[s]+1;i<blkno[e];++i)
ret+=f[i].val;
for(regint i=(blkno[e]-1)*bls+1;i<=e;++i)
ret+=lsta[i]^f[blkno[s]].lzt;
return ret;
}
} ptt;
signed main(){
scanf("%d%d",&n,&m);
ptt.build(n);
while(m--){
scanf("%d%d%d",&c,&a,&b);
if(!c) ptt.update(a,b);
else printf("%d\n",ptt.query(a,b));
}
return 0;
}