分块,qz
查看原帖
分块,qz
744853
FChang楼主2024/7/4 17:23
#include<bits/stdc++.h>
#define int long long
using namespace std;

/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1xu
2 1 4

*/

const int N = 5e5 + 15,M = 5e5 + 5;

int n,m,sq,len;

int a[N];

int sum[M],tag[N],p[N],ll[N],rr[N],siz[N];

void add(int l,int r,int d) {
	int l1 = ((l-1)/len+1),r1 = ((r-1)/len+1);
	l1 += (ll[l1]!=l);
	r1 -= (rr[r1]!=r);
	for(int i=l1; i<=r1; ++i) sum[i] += d * siz[i],tag[i] += d;
	for(int j=l; j<ll[l1]; ++j) a[j] += d,sum[p[j]]+=d;
	for(int j=rr[r1]+1; j<=r; ++j) a[j] += d,sum[p[j]]+=d;
	return ;
}

int query(int l,int r) {
	int l1 = ((l-1)/len+1),r1 = ((r-1)/len+1),res = 0;
	l1 += (ll[l1]!=l);
	r1 -= (rr[r1]!=r);
	for(int i=l1; i<=r1; ++i) res += sum[i];
	for(int j=l; j<ll[l1]; ++j) res += a[j] + tag[p[j]];
	for(int j=rr[r1]+1; j<=r; ++j) res += a[j] + tag[p[j]];
	return res;
}

signed main() {
	freopen("P3372_4.in","r",stdin);
	freopen("P3372.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0) , cout.tie(0);
	cin>>n>>m;
	for(int i=1; i<=n; ++i) cin>>a[i];
	len = sq = sqrt(n);
	for(int i=1; i<=sq; ++i) {
		ll[i] = rr[i-1] + 1,rr[i] = ll[i] + sq - 1;
		siz[i] = rr[i] - ll[i] + 1;
		for(int j=ll[i]; j<=rr[i]; ++j) sum[i] += a[j],p[j] = i;
	}
	if(rr[sq]!=n) {
		++sq;
		ll[sq] = rr[sq-1] + 1,rr[sq] = n;
		siz[sq] = rr[sq] - ll[sq] + 1;
		for(int j=ll[sq]; j<=n; ++j) sum[sq] += a[j],p[j] = sq;
	}
	int opt,x,y,k;
	while(m--) {
		cin>>opt>>x>>y;
		if(opt==1) {
			cin>>k;
			add(x,y,k);
		} else {
			cout<<query(x,y)<<"\n";
		}
	}
	return 0;
}

/*
((l-1)/sq+1):

1 2 3 4 5

1 1 2 2 3

*/
2024/7/4 17:23
加载中...