CreeperLordVader @ 2019-07-24 16:49:34
样例的第一次翻转就挂了。。。
貌似是在第二次split时splay操作出了问题
void splay(int& o,int k)
{
int d=tr[o].cmp(k);
if(d==1)k-=tr[tr[o].ch[0]].s+1;
if(d>=0)
{
int p=tr[o].ch[d];
int d2=tr[p].cmp(k);
int k2=(d2?k-tr[tr[p].ch[0]].s-1:k);
if(d2>=0)
{
pushdown(p);
splay(tr[p].ch[d2],k2);
if(d==d2)rotate(o,d^1);
else rotate(tr[o].ch[d],d);
}
rotate(o,d^1);
}
}
int merge(int left,int right)
{
splay(left,tr[left].s);
tr[left].ch[1]=right;
update(left);
return left;
}
void split(int o,int k,int& left,int& right)
{
splay(o,k);
left=o;
right=tr[o].ch[1];
tr[o].ch[1]=0;
update(left);
}
int l,r;
read(l);
read(r);
int o,left,mid,right;
split(rt,l,left,o);
split(o,r+1,mid,right);
tr[mid].flip^=1;
rt=merge(merge(left,mid),right);