RE 36分求助
查看原帖
RE 36分求助
617722
X_z_q楼主2022/10/6 14:57

RT,样例没问题

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=1e5+9;

int n,m;
int a[N],b[N],sum[N<<2],tag[N<<2];
void add(int x,int y,int l,int r,int k,int num){
	sum[num]+=k*(r-l+1);
	if(x==l&&y==r){
		tag[num]+=k;
		return;
	}
	int mid=(x+y)>>1;
	if(mid>=r)add(x,mid,l,r,k,num<<1);
	if(mid<l)add(mid+1,y,l,r,k,(num<<1)+1);
	if(mid>=l&&mid<r){
		add(x,mid,l,mid,k,num<<1);
		add(mid+1,y,mid+1,r,k,(num<<1)+1);
	}
}
int research(int x,int y,int l,int r,int num){
	if(x==l&&y==r){
		return sum[num];
	}
	int mid=(x+y)>>1;
	if(tag[num]){
		sum[num<<1]+=tag[num]*(mid+1-x);
		sum[(num<<1)+1]+=tag[num]*(y-mid);
		tag[num<<1]+=tag[num];
		tag[(num<<1)+1]+=tag[num];
		tag[num]=0;
	}
	if(mid>=r)return research(x,mid,l,r,num<<1);
	if(mid<l)return research(mid+1,y,l,r,(num<<1)+1);
	if(mid>=l&&mid<r)return research(x,mid,l,mid,(num<<1))+research(mid+1,y,mid+1,r,(num<<1)+1);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(register int i=1;i<=n;i++)scanf("%lld",&b[i]);
	for(int i=1;i<=n;i++)a[i]=b[i]-b[i-1];
	for(int i=1;i<=n;i++)add(1,n,i,i,a[i],1);
	for(register int i=1;i<=m;i++){
		int t,l,r,k,d;
		scanf("%lld%lld",&t,&l);
		if(t==1){
			scanf("%lld%lld%lld",&r,&k,&d);
			add(1,n,l+1,r,d,1);
			add(1,n,l,l,k,1);
			if(r<n)add(1,n,r+1,r+1,-k-(r-l)*d,1);
		}
		if(t==2)printf("%lld\n",research(1,n,1,l,1));
	}
	return 0;
}
2022/10/6 14:57
加载中...