萌新刚学OI,FHQ 爆蛋求助/kel
查看原帖
萌新刚学OI,FHQ 爆蛋求助/kel
360511
UperFicial楼主2021/6/17 18:08
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<cctype>
#include<stack>
#include<map>
#include<set>
using namespace std;
inline int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=s*10+(ch-'0'),ch=getchar();
	return s*w;
}
inline void output(int x)
{
	if(x/10) output(x/10);
	putchar(x%10+'0');
	return;
}
const int INF=1e9;
typedef long long ll;
inline int Min(int x,int y){return x<y?x:y;}
inline int Max(int x,int y){return x>y?x:y;}
inline void Swap(int&x,int&y){x^=y;y^=x;x^=y;}
const int MAXN(1e5+10);
int n,m;
int ch[MAXN][2],val[MAXN],siz[MAXN],rnd[MAXN];
int tot,rt,x,y,z;
bool tag[MAXN];
inline int New(int v)
{
	val[++tot]=v;
	siz[tot]=1;
	rnd[tot]=rand();
	tag[tot]=false;
	return tot;
}
inline void push_up(int u)
{
	siz[u]=siz[ch[u][0]]+siz[ch[u][1]]+1;
	return;
}
inline void push_down(int u)
{
	tag[u]=false;
	Swap(ch[u][0],ch[u][1]);
	tag[ch[u][0]]^=1;
	tag[ch[u][1]]^=1; 
	return;
}
inline void split(int u,int v,int&x,int&y)
{
	if(!u) x=y=0;
	else 
	{
		if(tag[u]) push_down(u);
		if(val[u]<=v) x=u,split(ch[u][1],v,ch[u][1],y);
		else y=u,split(ch[u][0],v,x,ch[u][0]);
		push_up(u);
	}
	return;
}
inline int unite(int x,int y)
{
	if(!x||!y) return x+y;
	if(rnd[x]<rnd[y])
	{
		if(tag[x]) push_down(x);
		ch[x][1]=unite(ch[x][1],y);
		push_up(x);
		return x;
	}
	else 
	{
		if(tag[y]) push_down(y);
		ch[y][0]=unite(x,ch[y][0]);
		push_up(y);
		return y;
	}
}
inline void ins(int v)
{
	split(rt,v,x,y);
	rt=unite(unite(x,New(v)),y);
	return;
}
inline void rev(int l,int r)
{
	split(rt,l-1,x,y);
	split(y,r,y,z);
	tag[y]^=1;
	rt=unite(x,unite(y,z));
	return;
}
inline void dfs(int u)
{
	if(!u) return;
	if(tag[u]) push_down(u);
	dfs(ch[u][0]);
	printf("%d ",val[u]);
	dfs(ch[u][1]);
	return;
}
int main()
{
	srand(time(0));
	n=read(),m=read();
	for(register int i=1;i<=n;i++) ins(i);
	while(m--)
	{
		int l=read(),r=read();
		rev(l,r);
		dfs(rt);
		puts("");
	}
	dfs(rt);
	return 0;
}
2021/6/17 18:08
加载中...