#include <bits/stdc++.h>
namespace IO{
#define LL long long
inline LL read(){
LL x=0,f=1;char c=getchar();
for (;!isdigit(c);c=getchar())if (c=='-')f=-1;
for (;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
inline void write(LL x,char c='\n'){
if (x){
if (x<0)x=-x,putchar('-');
char a[30];short l;
for (l=0;x;x/=10)a[l++]=x%10^48;
for (l--;l>=0;l--)putchar(a[l]);
}else putchar('0');putchar(c);
}
}using namespace IO;
using namespace std;
#define ls(now) (now<<1)
#define rs(now) (now<<1)
const int N = 132010;
struct Segment_Tree{//Cover区间覆盖标记,Reverse区间翻转标记
int l,r,Cover,Reverse;
}tree[N<<2];int res[N],n=N;
void Read(int &l,int &r){
l=r=0;char ch=getchar();
while (ch!='('&&ch!='[')ch=getchar();
int flag=(ch=='(');
while (!isdigit(ch))ch=getchar();
while (isdigit(ch))l=l*10+ch-48,ch=getchar();
l<<=1;l+=flag;
while (!isdigit(ch))ch=getchar();
while (isdigit(ch))r=r*10+ch-48,ch=getchar();
while (ch!=')'&&ch!=']')ch=getchar();
r<<=1;r-=ch==')';
}
void build(int now,int l,int r){
tree[now].l=l,tree[now].r=r,tree[now].Cover=-1;
if (l==r)return;
int mid=(l+r)>>1;
build(ls(now),l,mid);
build(rs(now),mid+1,r);
}
void pushdown(int now){
if (tree[now].Cover!=-1)
tree[ls(now)].Cover=tree[rs(now)].Cover=tree[now].Cover,
tree[ls(now)].Reverse=tree[rs(now)].Reverse=0,
tree[now].Cover=-1;
if (tree[now].Reverse)
tree[ls(now)].Reverse^=1,
tree[rs(now)].Reverse^=1,
tree[now].Reverse=0;
}
void update(int now,int x,int y,int val){
if (tree[now].l>y||tree[now].r<x||x>y)return;
if (x<=tree[now].l&&tree[now].r<=y){
if (val!=2)tree[now].Cover=val,tree[now].Reverse=0;
else tree[now].Reverse^=1;
return;
}
pushdown(now);
update(ls(now),x,y,val);
update(rs(now),x,y,val);
}
void Sort_Interval(int now){
if (tree[now].l==tree[now].r)
return res[tree[now].l]=tree[now].Cover==-1?
0:tree[now].Cover^tree[now].Reverse,void();
pushdown(now);
Sort_Interval(ls(now));
Sort_Interval(rs(now));
}
int main(){
build(1,0,n);char s[40];
while (scanf("%s",s)!=EOF){
int l,r;Read(l,r);
if (s[0]=='U')
update(1,l,r,1);
else if (s[0]=='I')
update(1,0,l-1,0),update(1,r+1,n,0);
else if (s[0]=='D')
update(1,l,r,0);
else if (s[0]=='C')
update(1,0,n,2),update(1,0,l-1,0),update(1,r+1,n,0);
else
update(1,l,r,2);
}
Sort_Interval(1);
int flg=0,ans=0;
for (int i=0;i<=n;i++){
// write(res[i]);
if (res[i]&&!flg){
// puts("Debug");
flg=ans=1;
if (i&1)printf("(%d,",i-1>>1);
else printf("[%d,",i>>1);
}
if (!res[i]&&flg){
// puts("Debug");
flg=0;
if (i&1)printf("%d] ",i-1>>1);
else printf("%d) ",i>>1);
}
}
if (!ans)puts("empty set");
return 0;
}
错因:读入完之后 res 数组中的元素全部为 0,所以大致是 build、update、pushdown 三个函数可能有误,但调两天死活调不出QAQ