萌新刚学oi,求助splay
查看原帖
萌新刚学oi,求助splay
482728
Engulf楼主2022/3/27 17:41

全WA,下载数据下来看运行也是正确滴

#include <bits/stdc++.h>
#define int long long
using namespace std;

inline int read(){
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch))f^=!(ch^45),ch=getchar();
	while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
inline void write(int x){
	if(x<0)x=-x,putchar('-');
	if(x>=10)write(x/10);
	putchar(x%10+'0');
}
inline void writeln(int x){write(x);puts("");}

int n,q,root,idx;
struct{int son[2],fa,siz,val,sum,add;}tr[100005];
int a[100005];
void pushup(int p){
	tr[p].sum=tr[tr[p].son[0]].sum+tr[tr[p].son[1]].sum+tr[p].val;
	tr[p].siz=tr[tr[p].son[0]].siz+tr[tr[p].son[1]].siz+1;
}
void pushdown(int p){
	if(tr[p].add){
		tr[tr[p].son[0]].add+=tr[p].add;
		tr[tr[p].son[1]].add+=tr[p].add;
		tr[tr[p].son[0]].val+=tr[p].add;
		tr[tr[p].son[1]].val+=tr[p].add;
		tr[tr[p].son[0]].sum+=tr[tr[p].son[0]].siz*tr[p].add;
		tr[tr[p].son[1]].sum+=tr[tr[p].son[1]].siz*tr[p].add;
		tr[p].add=0;
	}
}
void rotate(int x){
	pushdown(x);
	int y=tr[x].fa,z=tr[y].fa;
	int k=tr[y].son[1]==x;
	tr[z].son[tr[z].son[1]==y]=x,tr[x].fa=z;
	tr[y].son[k]=tr[x].son[k^1],tr[tr[x].son[k^1]].fa=y;
	tr[x].son[k^1]=y,tr[y].fa=x;
	pushup(y);pushup(x);
}
void splay(int x,int goal){
	while(tr[x].fa!=goal){
		int y=tr[x].fa,z=tr[y].fa;
		if(z!=goal){
			if((tr[z].son[1]==y) ^ (tr[y].son[1]==x))rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	if(!goal)root=x;
}
int New(int val,int fa){
	tr[++idx].val=tr[idx].sum=val;
	tr[idx].siz=1;tr[idx].fa=fa;
	return idx;
}
void build(int &p,int l,int r,int fa){
	if(l>r)return;
	int mid=l+r>>1;
	p=New(a[mid],fa);
	build(tr[p].son[0],l,mid-1,p);
	build(tr[p].son[1],mid+1,r,p);
	pushup(p);
}
int kth(int k){
	int p=root;
	while(114514){
		pushdown(p);
		if(tr[tr[p].son[0]].siz>=k)p=tr[p].son[0];
		else if(tr[tr[p].son[0]].siz+1>=k)return p;
		else k-=tr[tr[p].son[0]].siz+1,p=tr[p].son[1];
	}
}

signed main(){
	n=read();q=read();
	for(int i=1;i<=n;i++)a[i]=read();
	root=New(-0x3f3f3f3f,0);
	tr[root].son[1]=New(0x3f3f3f3f,root);
	tr[root].siz=2;
	build(tr[tr[root].son[1]].son[0],1,n,tr[root].son[1]);
	pushup(tr[root].son[1]);pushup(root);
	while(q--){
		int ch=read();
		if(ch==1){
			int l=read(),r=read(),c=read();++l;++r;
			l=kth(l-1);r=kth(r+1);
			splay(l,0);splay(r,l);
			tr[tr[r].son[0]].add+=c;
			tr[tr[r].son[0]].val+=c;
			tr[tr[r].son[0]].sum+=c*tr[tr[r].son[0]].siz;
			pushup(r);pushup(l);
		}else{
			int l=read(),r=read();++l;++r;
			l=kth(l-1);r=kth(r+1);
			splay(l,0);splay(r,l);
			writeln(tr[tr[r].son[0]].sum);
		}
	}
	return 0;
}
2022/3/27 17:41
加载中...