样例过了0分
查看原帖
样例过了0分
763540
Silence_nk_zht楼主2025/2/4 21:47
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, f, op, x, y, k,zhu,l,r;
int a[500010], tr1[500010], tr2[500010];
int d[500010];
int lowbit(int x) {
	return x & (-x);
}
void add(int x, int y) {
	for (int i = x; i <= n; i += lowbit(i)) {
		tr1[i] += y;
		tr2[i] += x * y;
	}
}
int get1(int x) {
	int sum = 0;
	for (int i = x; i >= 1; i -= lowbit(i)) {
		sum += tr1[i];
	}
	return sum;
}
int get2(int x) {
	int sum = 0;
	for (int i = x; i >= 1; i -= lowbit(i)) {
		sum += tr2[i];
	}
	return sum;
}
int print(int k) {
	return (k + 1) * get1(k) - get2(k);
}
signed main() {
	scanf("%d%d",&n,&f);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
		d[i]=a[i]-a[i-1];
		add(i, d[i]);
	}
	zhu=a[1];
	while(f--){
		scanf("%lld", &op);
		if(op==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			zhu+=k;
			if(x==1)x++;
			d[x]+=k;
			d[y+1]-=k;
			add(x,k);
			add(y+1,-k);
		}else if(op==2){
			scanf("%d",&k);
			zhu+=k;
		}else if(op==3){
			scanf("%d",&k);
			zhu-=k;			
		}else if(op==4){
			scanf("%lld%lld",&x,&y);
			if(x==1)printf("%lld\n", print(y) - print(x - 1)+zhu);
			else printf("%lld\n",print(y) - print(x - 1));
		}else{
			printf("%lld\n",zhu);
		}
	}
	return 0;
}

2025/2/4 21:47
加载中...