第五个和第八个测试点答案过长
查看原帖
第五个和第八个测试点答案过长
375039
shiq楼主2020/12/28 16:52

第五和第八个点答案过长

#include <bits/stdc++.h>
using namespace std;
long long tree[400010],a[100010],lazy[400010],x,y,k,f;
int n,m;
void build(long long left=1,long long right=n,long long i=1){
	if(left==right){tree[i]=a[left];return ;}
	long long mid=(left+right)>>1;
	build(left,mid,i<<1);
	build(mid+1,right,i<<1|1);
	tree[i]=tree[i<<1]+tree[i<<1|1];
}
void down(long long left=1,long long right=n,long long i=1){
	long long mid=(left+right)>>1;
	tree[i<<1]+=lazy[i]*(mid-left+1);
	lazy[i<<1]+=lazy[i];
	tree[i<<1|1]+=lazy[i]*(right-mid);
	lazy[i<<1|1]+=lazy[i];
	tree[i]=tree[i<<1]+tree[i<<1|1];
	lazy[i]=0;
}
void add(long long k,long long from,long long to,long long left=1,long long right=n,long long i=1){
	if(from<=left&&to>=right){
		tree[i]+=k*(right-left+1);
		lazy[i]+=k;
		return ;
	}
	down(left,right,i);
	long long mid=(left+right)>>1;
	if(to>mid)add(k,from,to,mid+1,right,i<<1|1);
	if(from<=mid)add(k,from,to,left,mid,i<<1);
	tree[i]=tree[i<<1]+tree[i<<1|1];
}
long long find(long long from,long long to,long long left=1,long long right=n,long long i=1){
	if(from<=left&&to>=right)return tree[i];
	long long ans=0,mid=(left+right)>>1;
	down(left,right,i);
	if(to>mid)ans+=find(from,to,mid+1,right,i<<1|1);
	if(from<=mid)ans+=find(from,to,left,mid,i<<1);
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build();
	for(int i=0;i<=m;i++){
		cin>>f;
		if(f==1){
			cin>>x>>y>>k;
			add(k,x,y);
		}
		else if(f==2){
			cin>>x>>y;
			cout<<find(x,y)<<endl;
		}
	}
	
	return 0;
}
2020/12/28 16:52
加载中...