蒟蒻求助,输入都输不完 w(゚Д゚)w
查看原帖
蒟蒻求助,输入都输不完 w(゚Д゚)w
211847
Bunnyhua楼主2021/6/6 20:47
#include<iostream>
using namespace std;

const int N=100005;

struct node{
	int l,r;
	int lazy_tag,d;
}t[4*N];
int a[N];

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

int query(int p,int l,int r){
	if(t[p].l==l&&t[p].r==r){
		return t[p].d;
	}
	int mid=(l+r)/2;
	if(r<=mid){
		return query(p*2,l,r);
	}
	else if(l>=mid+1){
		return query(p*2+1,l,r);
	}
	else{
		return query(p*2,l,mid)+query(p*2+1,mid+1,r);
	}
}

int get_d(int p){
	return t[p].d+t[p].lazy_tag*(t[p].r-t[p].l+1);
}

void pushdown(int p){
	if(t[p].lazy_tag==0)
		return;
	t[p].d=get_d(p);
	t[p*2].lazy_tag+=t[p].lazy_tag;
	t[p*2+1].lazy_tag+=t[p].lazy_tag;
	t[p].lazy_tag=0;
}

void change(int p,int l,int r,int x){
	if(t[p].l==l&&t[p].r==r){
		t[p].lazy_tag+=x;
		return;
	}
	pushdown(p);
	int mid=(l+r)/2;
	if(r<=mid){
		change(p*2,l,r,x);
	}
	else if(l>=mid+1){
		change(p*2+1,l,r,x);
	}
	else{
		change(p*2,l,mid,x);
		change(p*2+1,mid+1,r,x);
	}
	t[p].d=get_d(p*2)+get_d(p*2+1);
}

int main(){
	int n,m,c,x,y,k;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	
	build(1,1,n);
	
	while(m--){
		cin>>c;
		if(c==1){
			cin>>x>>y>>k;
			 change(1,x,y,k);
		}
		else{
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2021/6/6 20:47
加载中...