线段树1求调
  • 板块学术版
  • 楼主Cb_w
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/14 17:32
  • 上次更新2023/11/14 19:24:13
查看原帖
线段树1求调
499230
Cb_w楼主2023/11/14 17:32

RT

#include<iostream>
#include<cstdio>
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
using namespace std;
const int SIZE=1e5+1;

struct Sugmenttree
{
	int l,r;
	long long sum,add;
}tree[SIZE*4];
int a[SIZE];
int n,m;
inline void build(int p,int l,int r)
{
	cout<<p<<" "<<l<<" "<<r<<endl;
	l(p)=l,r(p)=r;
	if(l==r)
	{
		sum(p)=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build((p<<1)+1,mid+1,r);
	sum(p)=sum(p*2)+sum(p*2+1);
}
inline void push_down(int p)
{
	if(add(p))
	{
		sum(p<<1)+=add(p)*(r(p<<1)-l(p<<1)+1);
		sum((p<<1)+1)+=add(p)*(r((p<<1)+1)-l((p<<1)+1)+1);
		add(p<<1)+=add(p);
		add((p<<1)+1)+=add(p);
		add(p)=0;
	}
}
inline void change(int p,int l,int r,int d)
{
//	printf("change ok");
	if(l<=l(p)&&r>=r(p))
	{
		sum(p)+=((long long)d*(r(p)-l(p))+1);
		add(p)+=d;
		return;
	}
	push_down(p);
	int mid=(l(p)+r(p))/2;
	if(l<=mid)change(p*2,l,r,d);
	if(r>mid) change(p*2+1,l,r,d);
	sum(p)=sum(p*2)+sum(p*2+1);
}

inline long long ask(int p,int l,int r)
{
	if(l<=l(p)&&r>=r(p))
	{
		return sum(p);
	}
	push_down(p);
	int mid=(l(p)+r(p))/2;
	long long ans=0;
	if(l<=mid)ans+=ask(p*2,l,r);
	if(r>mid) ans+=ask(p*2+1,l,r);
	return ans;
	
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1)
		{
			int d;
			cin>>d;
			change(1,x,y,d);
		}
		else 
		{
			cout<<ask(1,x,y)<<endl;
		}
	}
	return 0;
}
2023/11/14 17:32
加载中...