不明白为啥会RE,数组范围也开够了
/*
U: [l,r] 赋值为1
I: [0,l-1],[r+1,n] 赋值为0
D: [l,r] 赋值为0
C: [0,n] 全部区间翻转,然后[0,l-1],[r+1,n]赋值为0
S; [l,r] 区间内01翻转
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
using namespace std;
const int N=2e5+9;
const int n=132010;
#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)
int tree[N<<2],l,r;
int laz[N<<2];
int cover[N<<2];
int ans[N];
void work(int &l, int &r)
{
char c = getchar();
for (; c != '(' && c != '['; c = getchar());
int w = c == '('; l = 0;
for (; !isdigit(c); c = getchar());
for (; isdigit(c); c = getchar()) l = (l << 1) + (l << 3) + (c ^ 48);
l <<= 1;
l += w, r = 0;
for (; !isdigit(c); c = getchar());
for (; isdigit(c); c = getchar()) r = (r << 1) + (r << 3) + (c ^ 48);
r <<= 1;
for (; c != ')' && c != ']'; c = getchar());
r -= c == ')';
}
void pushup(int rt)
{
int ls=rt<<1;
int rs=rt<<1|1;
if(cover[rt]!=-1)
{
cover[ls]=cover[rt];
cover[rs]=cover[rt];
laz[ls]=laz[rs]=0;//取消覆盖,注意优先级
cover[rt]=-1;
}
if(laz[rt])//翻转
{
laz[ls]^=1;
laz[rs]^=1;
laz[rt]=0;
}
}
void build(int rt,int l,int r)
{
cover[rt]=-1;
if(l==r) return;
build(lson);
build(rson);
}
void update(int rt,int l,int r,int L,int R,int k)
{
if(L<=l&&r<=R)
{
if(k!=2)
{
cover[rt]=k;
laz[rt]=0;
return;
}
else laz[rt]^=1;//翻转
return;
}
pushup(rt);
if(L<=mid) update(lson,L,R,k);
if(R>mid) update(rson,L,R,k);
}
void query(int rt,int l,int r)
{
if(l==r)
{
if(cover[rt]==-1) ans[l]=0;
else ans[l]=cover[rt]^laz[rt];
return;
}
pushup(rt);
query(lson);
query(rson);
}
void put_ans()
{
int flag=0;
int Emp=0;
for(int i=0;i<=n;++i)
{
if(ans[i]&&!flag)
{
flag=1;
Emp=1;
if (i & 1)
printf("(%d,",(i-1)>>1);
else
printf("[%d,",i>>1);
}
if (!ans[i]&&flag)
{
flag=0;
if(i&1) printf("%d] ", (i-1)>>1);
else printf("%d) ", i>>1);
}
}
if (!Emp) puts("empty set");
}
int main()
{
char s;
build(1,0,n);
while(cin>>s)
{
work(l,r);
if(l>r) continue;
if(s=='U') update(1,0,n,l,r,1);
else if(s=='I') update(1,0,n,0,l-1,0),update(1,0,n,r+1,n,0);
else if(s=='D') update(1,0,n,l,r,0);
else if(s=='C')
{
update(1,0,n,0,n,2);//区间翻转
update(1,0,n,0,l-1,0);
update(1,0,n,r+1,n,0);
}
else if(s=='S') update(1,0,n,l,r,2);
//for(int i=0;i<=32;i++) cout<<laz[i]<<" ";
}
query(1,0,n);
put_ans();
return 0;
}