分块20分求调
查看原帖
分块20分求调
994190
tengteng666666楼主2024/12/25 14:55
#include <bits/stdc++.h>
using namespace std;
long long n,f,a[1000001],s[1000001],b[1000001],id[1000001];
long long num;
void add(long long l,long long r,long long k){
	int sid = id[l],eid = id[r];
	if(sid==eid){
		for(int i =l;i<=r;i++){
			a[i] += k,s[sid]+=k; 
			return;
		}
	}
	for(long long i = l;id[i] == sid;i++){
		a[i] += k;s[id[i]] += k;
	}
	for(long long i = sid+1;i<=eid-1;i++){
		s[i] += num*k;
		b[i] += k;
	}
	for(long long i = r ; id[i] == eid;i -- ){
		a[i] += k;
		s[id[i]] += k; 
	}
	return;
}
long long query(long long l,long long r){
	long long sid = id[l],eid = id[r];
	if(sid == eid){
		long long sum = 0;
		for(long long i=l;i<=r;i++){
			sum+=a[i];
		}
		return sum;
	}
	long long sum = 0;
	for(long long i = l;id[i] == sid;i++){
		sum += b[id[i]] + a[i];
	}
	for(long long i = sid+1;i<eid;i++){
		sum += s[i];
	}
	for(long long i = r;id[i] == eid;i--){
		sum += b[id[i]] + a[i];
	}
	return sum;
}
int main(){
	cin>>n>>f;
	num = sqrt(n);
	for(long long i = 1;i<=n;i++){
		cin>>a[i]; 
		id[i] = (i-1)/num+1;
		s[id[i]] += a[i];
	} 
	for(long long i = 1;i<=f;i++){
		int o;
		cin>>o;
		if(o==1){
			long long l,r,k;
			cin>>l>>r>>k;
			add(l,r,k);
		}
		if(o==2){
			long long k;
			cin>>k;
			add(1,1,k);
		}
		if(o == 3){
			long long k;
			cin>>k;
			add(1,1,-k);
		}
		if(o==4){
			long long l,r;
			cin>>l>>r;
			cout<<query(l,r)<<endl;
		}
		if(o==5){
			cout<<query(1,1)<<endl;
		}
	}
	return 0;
}
2024/12/25 14:55
加载中...