分块求助!!!
查看原帖
分块求助!!!
431487
_zdc_楼主2020/12/19 15:40
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
int n,m,x,y,k,opt,block,t;
int a[N],sum[N],add[N],st[N],en[N],pos[N];
void change(int lt,int rt,int val){
	int p=pos[lt],q=pos[rt];
	if(p==q){
		for(int i=lt;i<=rt;i++)
			a[i]+=val;
		sum[p]+=(rt-lt+1)*val;
	}else
		for(int i=p+1;i<=q-1;i++){
			add[i]+=val;
			sum[i]+=(en[i]-st[i]+1)*val;
		}
}
int ask(int lt,int rt){
	int p=pos[lt],q=pos[rt];
	if(p==q){
		int s=0;
		for(int i=lt;i<=rt;i++) s+=a[i];
		return s+(rt-lt+1)*add[p];
	}
	int s=0;
	for(int i=p+1;i<=q-1;i++){
		s+=sum[i];
		s+=(en[i]-st[i]+1)*add[i];
	}
	for(int i=lt;i<=en[p];i++){
		s+=a[i];
		s+=add[p];
	}
	for(int i=st[q];i<=rt;i++){
		s+=a[i];
		s+=add[q];
	}
	return s;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	block=sqrt(n);
	t=n/block;
	if(n%block) t++;
	for(int i=1;i<=t;i++){
		st[i]=(i-1)*block+1;
		en[i]=i*block;
		if(i==t) en[i]=n;
		for(int j=st[i];j<=en[i];j++){
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
	while(m--){
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>k;
			change(x,y,k);
		}else cout<<ask(x,y)<<endl;
	}
	return 0;
}
2020/12/19 15:40
加载中...