9分求调
查看原帖
9分求调
500200
panrui_SCZ楼主2024/11/20 19:29

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int l,r,v,add;
}t[400005];
int a[100005],b[100005],n,m;
void build(int l,int r,int p){
	t[p].l=l,t[p].r=r;
	if(l==r){t[p].v=a[l];return;}
	int mid=(l+r)>>1;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	t[p].v=t[p*2].v+t[p*2+1].v;
}
void pushdown(int p){
	t[p*2].add+=t[p].add;
	t[p*2].v+=(t[p*2].r-t[p*2].l+1)*t[p].add;
	t[p*2+1].add+=t[p].add;
	t[p*2+1].v+=(t[p*2+1].r-t[p*2+1].l+1)*t[p].add;
	t[p].add=0;
}
void update(int l,int r,int v,int p){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].add+=p,t[p].v+=(t[p].r-t[p].l+1)*v;
		return;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) update(l,r,v,p*2);
	if(r>mid) update(l,r,v,p*2+1);
	t[p].v=t[p*2].v+t[p*2+1].v;
}
int query(int l,int r,int p){
	if(t[p].l>=l&&t[p].r<=r) return t[p].v;
	pushdown(p);
	int mid=(t[p].l+t[p].r)>>1,ans=0;
	if(l<=mid) ans+=query(l,r,p*2);
	if(r>mid) ans+=query(l,r,p*2+1);
	return ans;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=n-1;i>0;i--) a[i+1]-=a[i];
	build(1,n,1);
	int op,l,r,k,d;
	for(int i=1;i<=m;i++){
		cin>>op>>l;
		if(op==1){
			cin>>r>>k>>d;
			update(l,l,k,1);
			if(l+1<=r) update(l+1,r,d,1);
			if(r<n) update(r+1,r+1,(k+(r-l)*d)*(-1),1);
		}
		else printf("%lld\n",query(1,l,1));
	}
	return 0;
}
2024/11/20 19:29
加载中...