过大样例报蛋求助
查看原帖
过大样例报蛋求助
458075
Kuremi楼主2023/11/2 16:27

过大样例的sfw死不要脸的求助

#include<bits/stdc++.h>
#define ll long long
#define rr register
//#define inf 1000000000
#define N 500010
#define int ll
using namespace std;
inline int read()
{
	rr int num=0;rr bool f=0;rr char ch=getchar();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
	while(ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+(ch^48),ch=getchar();
	return f?-num:num;
}
std::mt19937 rnd(11451);

//
int n,m;
//
struct node{
	int ls,rs,val,key;
	int sum,fa;
	int siz;
}tr[N];
int cntf,root;
inline int newnode(int val)
{
	tr[++cntf].val=tr[cntf].sum=val;
	tr[cntf].ls=tr[cntf].rs=tr[cntf].fa=0;
	tr[cntf].siz=1;
	tr[cntf].key=rnd();
	//printf("%d %d\n",cntf,val);
	return cntf;
}

inline void mt(int x)
{
	tr[x].sum=tr[x].val+tr[tr[x].ls].sum+tr[tr[x].rs].sum;
	tr[x].siz=tr[tr[x].ls].siz+tr[tr[x].rs].siz+1;
	if(tr[x].ls)tr[tr[x].ls].fa=x;
	if(tr[x].rs)tr[tr[x].rs].fa=x;
	tr[x].fa=0;
}

inline void split(int now,int &x,int &y,int siz)
{
	if(!now){x=y=0;return;}
	if(tr[tr[now].ls].siz<siz)
		x=now,split(tr[now].rs,tr[x].rs,y,siz-tr[tr[now].ls].siz-1);
	else y=now,split(tr[now].ls,x,tr[y].ls,siz);
	tr[x].fa=0,tr[y].fa=0;
	mt(now);
}
inline int merge(int x,int y)
{
	if(!x||!y) return x|y;
	if(tr[x].key<tr[y].key)
	{
		tr[x].rs=merge(tr[x].rs,y),mt(x);
		return x;
	}tr[y].ls=merge(x,tr[y].ls),mt(y);
	return y;
}
inline int find(int x)
{
	while(tr[x].fa) x=tr[x].fa;
	return x;
}
#define nroot(x) (tr[tr[x].fa].rs==x)
inline int findrk(int x)
{
	rr int res=1+tr[tr[x].ls].siz;
	while(x)
	{
		//printf("x%d\n",x);
		if(nroot(x)) res+=tr[tr[tr[x].fa].ls].siz+1;
		x=tr[x].fa;
	}return res;
}
/*
inline void ldr(rr int x)
{
	if(!x) return ;
	//printf("stl%d ",x),
	ldr(tr[x].ls);
	//printf("endl%d ",x);
	printf("%d ",tr[x].val);
	//printf("str%d ",x),
	ldr(tr[x].rs);
//	printf("endr%d ",x);
	
}*/
inline void qry(int x,int y)
{
	int rtx=find(x),rkx=findrk(x),rky=findrk(y),xx,yy,zz,res;
	if(find(y)!=rtx){puts("-1");return;}
	if(rkx>rky) swap(rkx,rky);
	split(rtx,xx,yy,rkx-1);
	split(yy,yy,zz,rky-rkx+1);
	printf("%lld\n",tr[yy].sum);
	merge(xx,merge(yy,zz));
}
inline void mee(int x,int y)
{
	x=find(x),y=find(y);
	if(x==y) return;
	merge(y,x);
}
signed main()
{
	n=read(),m=read();
	for(rr int i=1;i<=n;i++) newnode(read());
	while(m--)
	{
		rr char opt;cin>>opt;
		rr int x=read(),y;
		if(opt=='Q') y=read(),qry(x,y);
		else if(opt=='M') y=read(),mee(x,y);
		else if(opt=='D')
		{
			rr int rtx=find(x),rkx=findrk(x),emm,emmm;
			//ldr(rtx);
			//printf("rkk%d\n",siz);
			split(rtx,emm,emmm,rkx-1);
		}
	}
}
2023/11/2 16:27
加载中...