#define lc (p << 1)
#define rc (p << 1 | 1)
#define mid ((l + r) >> 1)
using namespace std;
const int N = 1000005;
int a[N];
int sum[N << 2];
int tag[N << 2];
void up(int p) {
	sum[p] = sum[lc] + sum[rc];
}

void down(int l, int r, int p){
	if(!tag[p] || l == r) {
		return ;
	}
	sum[lc] += tag[p] * (mid - l + 1);
	sum[rc] += tag[p] * (r - mid);
	tag[lc] += tag[p];
	tag[rc] += tag[p];
	tag[p] = 0;
}
void build (int l, int r, int p) {
	if (l == r) {
		sum[p] = a[l];
		return ;
	}
	build(l, mid, lc);
	build(mid + 1, r, rc);
    up(p);
}

int query (int ql, int qr, int l, int r, int p){
	if (ql <= l && r <= qr) {
		return sum[p];
	}
	down(l,r,p);
	int res = 0 ;
	if(ql <= mid){
		res += query(ql, qr, l, mid, lc);
	}
	if(qr > mid){
		res += query(ql, qr, mid + 1, r, rc);
	}
	return res;
}

void update (int ql, int qr, int l, int r, int p, int v){
	if(ql <= l && r <= qr){
		sum[p] += v * (r-l+1);
		tag[p] += v;
		return ;
	}
	down(l,r,p);
	if(ql <= mid) {
		update(ql,qr,l,mid,lc,v);
	}
	if(qr > mid) {
		update(ql,qr,mid + 1,r,rc,v);
	}
	up(p);
}

int main(){
	int n;
	cin>>n;
	for(int i = 1; i <= n; i++) {
		cin>>a[i];
	} 
	int m;
	cin>>m;
	for(int i = 1, op, l, r, x; i <= m; i++) {
		cin>>op;
		if(op == 1){
			cin>>l>>r>>x;
			update(l, r, 1, n, 1, x);
		} 
		else{
			cin>>l>>r;
		    cout<<query(l,r,1,n,1)<<endl;
		}
	}
}```

1 条评论

  • @ 2025-8-27 16:01:50

    #include <bits/stdc++.h> #define lc (p << 1) #define rc (p << 1 | 1) #define mid ((l + r) >> 1) #define int long long // using namespace std; const int N = 1000005; int a[N]; int sum[N << 2]; int tag[N << 2]; void up(int p) { sum[p] = sum[lc] + sum[rc]; }

    void down(int l, int r, int p){ if(!tag[p] || l == r) { return ; } sum[lc] += tag[p] * (mid - l + 1); sum[rc] += tag[p] * (r - mid); tag[lc] += tag[p]; tag[rc] += tag[p]; tag[p] = 0; } void build (int l, int r, int p) { if (l == r) { sum[p] = a[l]; return ; } build(l, mid, lc); build(mid + 1, r, rc); up(p); }

    int query (int ql, int qr, int l, int r, int p){ if (ql <= l && r <= qr) { return sum[p]; } down(l,r,p); int res = 0 ; if(ql <= mid){ res += query(ql, qr, l, mid, lc); } if(qr > mid){ res += query(ql, qr, mid + 1, r, rc); } return res; }

    void update (int ql, int qr, int l, int r, int p, int v){ if(ql <= l && r <= qr){ sum[p] += v * (r-l+1); tag[p] += v; return ; } down(l,r,p); if(ql <= mid) { update(ql,qr,l,mid,lc,v); } if(qr > mid) { update(ql,qr,mid + 1,r,rc,v); } up(p); }

    signed main(){ int n; cin>>n; for(int i = 1; i <= n; i++) { cin>>a[i]; } build(1,n,1);// int m; cin>>m; for(int i = 1, op, l, r, x; i <= m; i++) { cin>>op; if(op == 1){ cin>>l>>r>>x; update(l, r, 1, n, 1, x); } else{ cin>>l>>r; cout<<query(l,r,1,n,1)<<endl; } } } //4

    • 1