刚学线段树,求调
查看原帖
刚学线段树,求调
539133
q1uple楼主2022/11/2 17:14
#include<bits/stdc++.h> 
using namespace std;
const int maxn=1e5+5;
int a[maxn];

struct node{
	int l,r,sum;
	int lzy;
}tree[4*maxn];


void maketag(int u,int len,int k)//lazy-tag 
{
	tree[u].lzy+=k;
	tree[u].sum+=len*k;
}

void push(int u)//修改 
{
	tree[u].sum=tree[u*2].sum+tree[u*2+1].sum;
}

void pushdown(int u,int l,int r)//下放 
{
	int mid=(l+r)/2;
	maketag(u*2,mid-l+1,tree[u].lzy);
	maketag(u*2+1,r-mid,tree[u].lzy);
	tree[u].lzy=0;
}

void build(int u,int l,int r)//建树 
{
	if(l==r)
	{
		tree[u].sum=a[l];
		tree[u].l=l,tree[u].r=r;
		return;
	}
	tree[u].l=l,tree[u].r=r;
	int mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	push(u);
	return;
}

int range(int u,int l,int r)//查询 
{
	if(tree[u].l>=l&&tree[u].r<=r)	
		return tree[u].sum;
	if(tree[u].l>r||tree[u].r<l)
		return 0;
	pushdown(u,tree[u].l,tree[u].r);
	return range(u*2,l,r)+range(u*2+1,l,r);
} 

void update(int u,int l,int r,int k)//区间修改 
{
	if(tree[u].l>=l&&tree[u].r<=r)	
		maketag(u,tree[u].r-tree[u].l+1,k);
	else if(tree[u].l>r||tree[u].r<l)
		return ;
	else
	{
		pushdown(u,tree[u].l,tree[u].l);
		update(u*2,l,r,k);
		update(u*2+1,l,r,k);
		push(u);
	}	
}

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	while(m--)
	{
		int ty;
		cin>>ty;
		if(ty==1)
		{
			int x,y,k;
			cin>>x>>y>>k; 
			update(1,x,y,k);
		}
		if(ty==2)
		{
			int x,y;
			cin>>x>>y; 
			cout<<range(1,x,y)<<'\n';
		}
	}
}
2022/11/2 17:14
加载中...