#3WA
查看原帖
#3WA
220509
国国の国王楼主2020/9/26 14:03
#include<bits/stdc++.h>
using namespace std;
long long a[200000],tree[600000],laz[600000],s[200001];
void treemake(long long now,long long l,long long r){
	if(l==r){
		tree[now]=a[l];
		return;
	}
	int mid=(l+r)/2;
	treemake(now*2,l,mid);
	treemake(now*2+1,mid+1,r);
	tree[now]=tree[now*2]+tree[now*2+1];
}
void pull(long long now,long long l,long long r){
	if(!laz[now]) return;
	int mid=(l+r)/2;
	tree[now*2]+=laz[now]*(mid-l+1);
	tree[now*2+1]+=laz[now]*(r-mid);
	laz[now*2]+=laz[now];
	laz[now*2+1]+=laz[now];
	laz[now]=0;
}
void t1(long long now,long long l,long long r,long long ll,long long rr,long long kkk){
	if(ll<=l&&rr>=r){
		laz[now]+=kkk;
		tree[now]+=kkk*(r-l+1);
		return;
	}
	pull(now,l,r);
	long long mid=(l+r)/2;
	if(ll<=mid) t1(now*2,l,mid,ll,rr,kkk);
	if(rr>mid) t1(now*2+1,mid+1,r,ll,rr,kkk);
	tree[now]=tree[now*2]+tree[now*2+1];
}
long long t2(long long now,long long l,long long r,long long ll,long long rr){
	if(ll<=l&&rr>=r){
		return tree[now];
	}
	pull(now,l,r);
	long long mid=(l+r)/2,ans=0;
	if(ll<=mid) ans+=t2(now*2,l,mid,ll,rr);
	if(rr>mid) ans+=t2(now*2+1,mid+1,r,ll,rr);
	return ans;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) a[i]=s[i]-s[i-1];
	treemake(1,1,n);
	while(m--){
		long long k,ll,rr,d;
		cin>>k;
		if(k==1){
			cin>>ll>>rr>>k>>d;
			t1(1,1,n,ll,ll,k);
			t1(1,1,n,ll+1,rr,d);
			if(rr!=n) t1(1,1,n,rr+1,rr+1,-(k+((rr-ll)*d)));
		}
		else{
			cin>>k;
			cout<<t2(1,1,n,1,k)<<endl;
		}
	}
}

t1修改值,t2求和

2020/9/26 14:03
加载中...