10分求调
查看原帖
10分求调
1090425
yehuadonghui楼主2024/1/3 20:44
#include <bits/stdc++.h>
using namespace std;
const int maxn =  100010;

int a[maxn+2];
struct tree{
	int l,r;
	long long pre,add;
}t[4*maxn+2];

void build(int p,int l,int r)
{
	
	t[p].l=l;
	t[p].r=r;
	if(l==r) {
		t[p].pre=a[l];
		return ;
	} 
	int mid= (l+r)>>1;
	
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	
	t[p].pre=t[p*2].pre+t[p*2+1].pre;	
}//建树

void spread(int p){
	if(t[p].add) {
		t[p*2].pre+=t[p].add*(t[p*2].r-t[p*2].l+1);
		t[p*2+1].pre=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
		t[p*2].add+=t[p].add;
		t[p*2+1].add+=t[p].add;
		t[p].add=0;
		
	}
	
}//懒标记。

void change(int p,int x,int y,int z)//区间修改
{
	if(x<=t[p].l && y>=t[p].r) {
		t[p].pre+=(long long )z*(t[p].r-t[p].l+1);
		t[p].add+=z;
		return ;
	}
	
	spread(p);
	int mid= (t[p].l+t[p].r)>>1;
	if(x<=mid) change(p*2,x,y,z);
	if(y>mid) change(p*2+1,x,y,z);
	
	t[p].pre=t[p*2].pre+t[p*2+1].pre;
	
}

long long ask(int p,int x,int y)//区间查询
{
	if(x<=t[p].l && y>=t[p].r) {
		return t[p].pre;
	} 
	spread(p);
	int mid= (t[p].l+t[p].r) >>1;
	long long ans=0;
	
	if(x<=mid) ans+=ask(p*2,x,y);
	if(y>mid) ans+=ask(p*2+1,x,y);
	
	return ans;
	
}

int main()
{
	int n,m;
	cin>>n>>m;
	
	for (int i=1;i<=n;i++) {
		cin>>a[i];
	}
	build(1,1,n);
	
	for (int i=1;i<=m;i++){
		int o,x,y,k;
		
		cin>>o;
		
		if(o==1) {
			cin>>x>>y>>k;
			change(1,x,y,k);
			
		}
		else {
			cin>>x>>y;
			cout<<ask(1,x,y)<<endl;
		}
	}
	
	
	
	
	
}
2024/1/3 20:44
加载中...