56分求助
查看原帖
56分求助
1020531
liuyiyang_khaili楼主2024/3/14 16:38
#include<stdio.h>
using namespace std;
#define ll long long
const int N = 5e5 + 7;
ll c[N], c2[N];
ll z;
int n, f;
int lowbit(int x){
	return x & -x;
}
void add(int x, int d){
	for(int i = x; i <= n; i += lowbit(i)){
		c[i] += d;
		c2[i] += x * d;
	}
}
void r_add(int l, int r, int d){
	add(l, d);
	add(r + 1, -d);
}
ll query(int x){
	ll sum = 0;
	for(int i = x; i; i -= lowbit(i)){
		sum += (x + 1) * c[i] - c2[i];
	}
	return sum;
}
ll r_query(int l, int r){
	ll ans = query(r) - query(l - 1);
	if(l == 1){
		ans += z;
	}
	return ans;
}
int main(){
	scanf("%d%d", &n, &f);
	for(int i = 1, now, lst = 0; i <= n; i++, lst = now){
		scanf("%d", &now);
		add(i, now - lst);
	}
	int opt;
	while(f--){
		scanf("%d", &opt);
		if(opt == 1){
			int l, r, k;
			scanf("%d%d%d", &l, &r, &k);
			r_add(l, r, k);
		}
		else{
			if(opt == 2){
				int k;
				scanf("%d", &k);
				z += k;
			}
			else{
				if(opt == 3){
					int k;
					scanf("%d", &k);
					z -= k;
				}
				else{
					if(opt == 4){
						int l, r;
						scanf("%d%d", &l, &r);
						printf("%lld\n", r_query(l, r));
					}
					else{
						printf("%lld\n", z + query(1));
					}
				}
			}
		}
	}
	return 0;
}
2024/3/14 16:38
加载中...