#2#4wa了,求大佬看看
查看原帖
#2#4wa了,求大佬看看
254491
橙橙like海绵楼主2022/1/2 21:58
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1e6+10;
ll sum[N],a[N],n,m,add[N];	
ll fun[N];
void build(int k,int l,int r){
	if(l==r){sum[k]=a[l];return ;}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
}
void Add(ll k,ll l,ll r,ll v){
	add[k]+=v;
	sum[k]+=v*(r-l+1);
}
void push_down(int k,int l,int r,int mid){
	if(!add[k]) return;
	Add(k*2,l,mid,add[k]);
	Add(k*2+1,mid+1,r,add[k]);
	add[k]=0;
}
void change(int k,int l,int r,int x,int y,ll v){
	if(x<=l&&r<=y){Add(k,l,r,v);return;}
	int mid=(l+r)/2;
	push_down(k,l,r,mid);
	if(x<=mid) change(k*2,l,mid,x,y,v);
	if(mid<y) change(k*2+1,mid+1,r,x,y,v);
	sum[k]=sum[k*2]+sum[k*2+1];
}
ll query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y){return sum[k];}
	int mid=(l+r)/2;
	ll res=0;
	push_down(k,l,r,mid);
	if(x<=mid) res+=query(k*2,l,mid,x,y);
	if(mid<y) res+=query(k*2+1,mid+1,r,x,y);
	return res;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&fun[i]);
		a[i]=fun[i]-fun[i-1];
	} 
	build(1,1,n);
	int opt,l,r,k,d;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&opt,&l);
		if(opt==1){
			scanf("%d%d%d",&r,&k,&d);
			change(1,1,n,l,l,k);
			change(1,1,n,l+1,r,d);
			change(1,1,n,r+1,r+1,(ll)(-(k+d*(r-l))));
		}
		
		else{
			printf("%lld\n",query(1,1,n,1,l));
		}
	}
	return 0;
}
2022/1/2 21:58
加载中...