代码量挺短的,求求神仙们花时间帮蒟蒻看看吧qwq
样例过了全部WA,求助
#include<bits/stdc++.h>
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
const int N=1e5+5;
struct node{
int s[2];
int val,siz,rd,tag;
}tree[N];
int num,root,x,y,z;
inline int read(){
int x=0;
bool w=0;
char c=getchar();
while(!isdigit(c)) w|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
inline void print(int x){
if(x<0) x=-x,putchar('-');
if(x>9) print(x/10);
putchar('0'+x%10);
}
inline void push_up(int p){
tree[p].siz=tree[tree[p].s[0]].siz+tree[tree[p].s[1]].siz+1;
}
inline void push_down(int x){
swap(tree[x].s[0],tree[x].s[1]);
tree[tree[x].s[0]].tag^=1;
tree[tree[x].s[1]].tag^=1;
tree[x].tag=0;
}
inline void split(int p,int val,int &x,int &y){
if(!p){
x=y=0;
return ;
}
push_down(p);
if(tree[p].val<=val) x=p,split(tree[p].s[1],val,tree[p].s[1],y);
else y=p,split(tree[p].s[0],val,x,tree[p].s[0]);
push_up(p);
}
inline int merge(int x,int y){
if(!x || !y) return x+y;
if(tree[x].rd<tree[y].rd){
if(tree[x].tag) push_down(x);
tree[x].s[1]=merge(tree[x].s[1],y);
push_up(x);
return x;
}
if(tree[y].tag) push_down(y);
tree[y].s[0]=merge(x,tree[y].s[0]);
push_up(y);
return y;
}
inline int Newnode(int x){
tree[++num].rd=rand(),tree[num].siz=1,tree[num].val=x;
return num;
}
inline void Insert(int val){
root=merge(root,Newnode(val));
}
inline void Get_ans(int p){
if(tree[p].tag) push_down(p);
if(tree[p].s[0]) Get_ans(tree[p].s[0]);
printsp(tree[p].val);
if(tree[p].s[1]) Get_ans(tree[p].s[1]);
}
signed main(){
int n=read(),m=read();
for(register int i=1;i<=n;++i){
Insert(i);
}
while(m--){
int l=read(),r=read();
split(root,l-1,x,y);
split(y,r,y,z);
tree[y].tag^=1;
root=merge(x,merge(y,z));
}
Get_ans(root);
return 0;
}