空超60了,想用bitset代替bool,结果wa了。
有没有人帮我看看
#include<bits/stdc++.h>
#define N 200005
#define rd read()
#define gc getchar()
using namespace std;
const int mod=(1<<30);
bitset<1> a[31];
int m,n;
inline int read()
{
int x=0,ss=1,s=gc;
while(!isdigit(s)&&s!='-')s=gc;
if(s=='-')ss*=-1,s=gc;
while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc;
return ss*x;
}
bitset<1> lazy[31];
bitset<1> fir[31];
int f1[31][N<<2];
int lans=0;
void pushup(int id,int mid,int k)
{
fir[k][id]=fir[k][id<<1];
if(fir[k][id<<1]==fir[k][id<<1|1])f1[k][id]=min(f1[k][id<<1],f1[k][id<<1|1]);
else f1[k][id]=min(f1[k][id<<1],mid+1);
}
void init(int id,int l,int r,int k)
{
if(l==r)
{
f1[k][id]=INT_MAX;
fir[k][id]=a[k][l];
return;
}
int mid=l+r>>1;
init(id<<1,l,mid,k);
init(id<<1|1,mid+1,r,k);
pushup(id,mid,k);
}
void pushdown(int id,int l,int r,int k)
{
if(lazy[k][id]==1)
{
fir[k][id<<1]=fir[k][id<<1]^1;
fir[k][id<<1|1]=fir[k][id<<1|1]^1;
lazy[k][id<<1]=lazy[k][id<<1]^1;
lazy[k][id<<1|1]=lazy[k][id<<1|1]^1;
lazy[k][id]=0;
}
}
void insert(int id,int l,int r,int x,int y,int k)
{
if(l>=x&&r<=y)
{
fir[k][id]=fir[k][id]^1;
lazy[k][id]=lazy[k][id]^1;
return;
}
pushdown(id,l,r,k);
int mid=l+r>>1;
if(x<=mid)insert(id<<1,l,mid,x,y,k);
if(y>mid)insert(id<<1|1,mid+1,r,x,y,k);
pushup(id,mid,k);
}
int ask(int id,int l,int r,int x,int y,int k)
{
if(l>=x&&r<=y)
{
if(fir[k][id])return l;
else return f1[k][id];
}
pushdown(id,l,r,k);
int mid=l+r>>1,ans=INT_MAX;
if(x<=mid)ans=min(ans,ask(id<<1,l,mid,x,y,k));
if(y>mid)ans=min(ans,ask(id<<1|1,mid+1,r,x,y,k));
return ans;
}
signed main()
{
n=rd,m=rd;
for(int i=1;i<=n;i++)
{
int x=rd,pos=0;
while(x)
{
if(x&1)a[pos][i]=1;
x>>=1;
pos++;
}
}
for(int i=0;i<=29;i++)init(1,1,n,i);
while(m--)
{
int op=rd,l=rd,r=rd;
l^=lans,r^=lans;
l%=n,r%=n;
l++,r++;
if(l>r)swap(l,r);
if(op==1)
{
int k=rd;
for(int i=0;i<=29;i++)
{
if(k&1)insert(1,1,n,l,r,i);
k>>=1;
}
}
else
{
long long ans=0,mul=1;
for(int i=0;i<=29;i++)
{
int pos=ask(1,1,n,l,r,i);
if(pos<=r)(ans+=(r-pos+1)*mul)%=mod;
mul<<=1;
}
cout<<(lans=ans)<<'\n';
}
}
return 0;
}