fhq_treap区间操作求助。
查看原帖
fhq_treap区间操作求助。
1045879
cheng2010楼主2024/4/29 13:07

可以过样例。

代码:

#include<bits/stdc++.h>
#define tp_rt Tree.root
#define INF 2147483647
using namespace std;
const int N=1e6+7;
int n,q;
struct FHQ_treap
{
	int lson,rson,siz,rnd,val,sum;
	int add;
}tree[N];
struct FHQ_TREAP
{
	int cnt;
	int root;
	inline void change(int x)
	{
		tree[x].siz=tree[tree[x].lson].siz+tree[tree[x].rson].siz+1;
		tree[x].sum=tree[x].val;
		if(tree[x].lson) tree[x].sum+=tree[tree[x].lson].sum;
		if(tree[x].rson) tree[x].sum+=tree[tree[x].rson].sum;
	}
	inline void down(int x)
	{
		if(tree[x].add!=0)
		{
			if(tree[x].lson)
			{
				tree[tree[x].lson].add+=tree[x].add;
				tree[tree[x].lson].val+=tree[x].add;
				tree[tree[x].lson].sum+=tree[x].add;
			}
			if(tree[x].rson)
			{
				tree[tree[x].rson].add+=tree[x].add;
				tree[tree[x].rson].val+=tree[x].add;
				tree[tree[x].rson].sum+=tree[x].add;
			}
			tree[x].add=0;
			change(x);
		}
	}
	inline void split_siz(int now,int key,int &x,int &y)
	{
		if(!now)
		{
			x=y=0;
			return;
		}
		down(now);
		if(tree[tree[now].lson].siz<key)
		{
			x=now;
			split_siz(tree[now].rson,key-1-tree[tree[now].lson].siz,tree[now].rson,y);
		}
		else
		{
			y=now;
			split_siz(tree[now].lson,key,x,tree[now].lson);
		}
		change(now);
	}
	inline int merge(int x,int y)
	{
		if(!x||!y) return x|y;
		if(tree[x].rnd<tree[y].rnd)
		{
			down(x);
			tree[x].rson=merge(tree[x].rson,y);
			change(x);
			return x; 
		}
		down(y);
		tree[y].lson=merge(x,tree[y].lson);
		change(y);
		return y;
	}
	inline int join(int x)
	{
		tree[++cnt].rnd=rand();
		tree[cnt].siz=1;
		tree[cnt].val=x;
		tree[cnt].sum=x;
		return cnt;
	}
	inline void ins(int &rt,int x)
	{
		rt=merge(rt,join(x));
	}
	inline void update(int &rt,int l,int r,int x)
	{
		int r1=0,r2=0,r3=0;
		split_siz(rt,l-1,r1,r2);
		split_siz(r2,r-l+1,r2,r3);
		tree[r2].add+=x;
		tree[r2].sum+=x;
		tree[r2].val+=x;
		rt=merge(r1,merge(r2,r3));
	}
	inline void query(int &rt,int l,int r)
	{
		int r1=0,r2=0,r3=0;
		split_siz(rt,l-1,r1,r2);
		split_siz(r2,r-l+1,r2,r3);
		printf("%d\n",tree[r2].sum);
		rt=merge(r1,merge(r2,r3));
	}
}Tree;
int main()
{
	srand(time(NULL));
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x); 
		Tree.ins(tp_rt,x);
	}
	while(q--)
	{
		int opt,x,y,z;
		scanf("%d %d %d",&opt,&x,&y);
		if(opt==1)
		{
			scanf("%d",&z);
			Tree.update(tp_rt,x,y,z);
		}
//		if(opt==1)
//		{
//			Tree.tolate(tp_rt,x,y);
//		}
		else if(opt==2)
		{
			Tree.query(tp_rt,x,y);
		}
	}
}
2024/4/29 13:07
加载中...