跪求大佬康康有没有越界。
(https://www.luogu.com.cn/problem/P3391)[文艺平衡树]
#include<cstdio>
const int N=1e6+10;
#include<algorithm>
#include<stack>
using std::stack;
namespace Splay
{
struct node
{
int rev,val,siz;
int son[2],fa;
}T[N];
stack<int> trash_bin;
int size=0,root=0;
bool get(int p) {return p==T[T[p].fa].son[1];}
int new_node()
{
if(!trash_bin.empty())
{
int ret=trash_bin.top();
trash_bin.pop();
return ret;
}
else return ++size;
}
void pushup(int p)
{
T[p].siz=T[T[p].son[0]].siz+T[T[p].son[1]].siz+1;
}
void pushdown(int p)
{
if(T[p].rev)
{
T[p].rev=0;
T[T[p].son[0]].rev^=1;
T[T[p].son[1]].rev^=1;
std::swap(T[p].son[0],T[p].son[1]);
T[0].rev=0;
}
}
int build(int vals[],int l,int r,int fa=0)
{
if(l>r) return 0;
int mid=l+r>>1,p=new_node();
T[p].val=vals[mid];
T[p].siz=1;T[p].fa=fa;
T[p].son[0]=build(vals,l,mid-1,p);
T[p].son[1]=build(vals,mid+1,r,p);
pushup(p);
return p;
}
int rotate(int p)
{
// printf("%d\n",p);
int f=T[p].fa,g=T[f].fa,t=get(p);
T[g].son[get(f)]=p;
T[T[p].son[t^1]].fa=f;T[f].fa=p;
T[p].fa=g;
T[f].son[t]=T[p].son[t^1];T[p].son[t^1]=f;
T[0].fa=T[0].son[0]=T[0].son[1]=0;
pushup(f),pushup(p);
}
void print(int p=root)
{
if(!p) return;
pushdown(p);
print(T[p].son[0]);
printf("%d ",T[p].val);
print(T[p].son[1]);
}
void splay(int p,int goal=0)
{
// print();printf("as %d\n",T[p].val);
while(T[p].fa!=goal)
{
// printf("!%d %d\n",p,goal);
if(T[T[p].fa].fa!=goal) rotate(get(T[p].fa)==get(p)?T[p].fa:p);
rotate(p);
}
if(goal==0) root=p;
// print();printf("\n");
}
int kth(int k,int goal=0)
{
int p=root,s=0;//s means the rank of p
// printf("\nstart as %d\n",p);
while(1)
{
pushdown(p);pushdown(T[p].son[0]),pushdown(T[p].son[1]);
s+=T[T[p].son[0]].siz+1;
// printf("%d(%d) %d ask:%d\n",p,T[p].val,s,k);
if(k==s) {splay(p,goal);return p;}
else if(k<s) s-=T[T[p].son[0]].siz+1,p=T[p].son[0];
else p=T[p].son[1];
}
}
int interval(int l,int r)
{
// printf("[%d,%d]",l,r);
if(l==1&&r==size) return root;
if(l==1) {kth(r+1);return T[root].son[0];}
if(r==size) {kth(l-1);return T[root].son[1];}
kth(r+1),kth(l-1,root);return T[T[root].son[0]].son[1];
}
void reverse(int l,int r)
{
int p=interval(l,r);
// printf("%d\n",T[0].val);
T[p].rev^=1;
// pushdown(p);
// splay(p);
// print();printf("\n");
}
}
int a[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
a[i]=i;
Splay::root=Splay::build(a,1,n);
for(int i=1,l,r;i<=m;i++)
scanf("%d%d",&l,&r),Splay::reverse(l,r);
Splay::print();
}