模板题。
从0开始到n+2结束。
每次把起点前一个点置为跟,右端点的下一个点作为跟的右节点,这样跟的右节点的左节点就是操作的区间,pushdown和pushup和线段树的很类似。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define maxn 110000
int root,siz[maxn],val[maxn],tr[maxn][2],fa[maxn],id[maxn];
int cnt,people,ans,n,m,t1,t2;
bool rev[maxn];
inline int getint()
{
char c;
int res;
while (c = getchar(), ('0' > c || c > '9') && c != '-');
int flag=1;
if(c=='-') flag=-1,res=0;
else res=c-'0';
while (c = getchar(), '0' <= c && c <= '9')
res = res * 10 + c - '0';
return res*flag;
}
inline void pushup(int k)
{
int l=tr[k][0],r=tr[k][1];
siz[k]=siz[l]+siz[r]+1;
}
inline void pushdown(int k)
{
int l=tr[k][0],r=tr[k][1];
if(rev[k])
{
swap(tr[k][0],tr[k][1]);
rev[l]^=1;rev[r]^=1;
rev[k]=0;
}
}
inline int select(int k,int rk)
{
pushdown(k);
int l=tr[k][0],r=tr[k][1];
if(siz[l]+1==rk)return k;
else if(siz[l]>=rk)return select(l,rk);
else return select(r,rk-siz[l]-1);
}
inline void rotateup(int x,int& rt)
{
int l,r,y,z;
y=fa[x];z=fa[y];
if(tr[y][0]==x)l=0;else l=1;r=l^1;
if(y==rt) rt=x;
else
{
if(tr[z][0]==y) tr[z][0]=x;
else tr[z][1]=x;
}
fa[y]=x;fa[x]=z;fa[tr[x][r]]=y;
tr[y][l]=tr[x][r];tr[x][r]=y;
pushup(y);pushup(x);
}
inline void splay(int x,int& rt)
{
int y,z;
while(x!=rt)
{
y=fa[x];z=fa[y];
if(y!=rt)
{
if( (tr[y][0]==x)^(tr[z][0]==y) ) rotateup(x,rt);
else rotateup(y,rt);
}
rotateup(x,rt);
}
}
inline void rever(int l,int r)
{
int x=select(root,l);
int y=select(root,r+2);
splay(x,root);splay(y,tr[x][1]);
rev[tr[y][0]]^=1;
}
inline void build(int l,int r,int f)
{
if(l>r) return;
int now=id[l],last=id[f];
if(l==r)
{
fa[now]=last;siz[now]=1;
if(l<f) tr[last][0]=now;
else tr[last][1]=now;
return;
}
int mid=(l+r)>>1;now=id[mid];
build(l,mid-1,now);
build(mid+1,r,now);
if(mid<f) tr[last][0]=now;
else tr[last][1]=now;
fa[now]=last;
pushup(now);
}
int main()
{
n=getint();m=getint();
for(int i=1;i<=n+2;i++)
id[i]=++cnt;
build(1,n+2,0);
root=(n+3)>>1;
for(int i=1;i<=m;i++)
{
int l=getint(),r=getint();
rever(l,r);
}
for(int i=2;i<=n+1;i++)
printf("%d ",select(root,i)-1);
return 0;
}