求助
查看原帖
求助
563080
lz003楼主2022/1/29 00:39
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
using ll = long long;
#define lson (o << 1)
#define rson ((o << 1) | 1)
#define mid ((l + r) >> 1)
const int N = 1e5 + 5;

inline ll read(){
	ll x = 0;
	char c = getchar();
	while(!isdigit(c)){
		c = getchar();
	}
	while(isdigit(c)){
		x = (x << 3) + (x << 1) + c - '0';
		c = getchar();
	}
	return x;
}

struct segtree{
	ll sum, laz;
}dat[N << 1];

ll n, q, a[N];

void update(ll o){
	dat[o].sum = dat[lson].sum + dat[rson].sum;
	return ;
}

void build(ll o, ll l, ll r){
	if(l == r){
		dat[o].sum = a[l];
		return ;
	}
	build(lson, l, mid);
	build(rson, mid + 1, r);
	update(o);
	return ;
}
void pushdown(ll o, ll l, ll r){
	if(dat[o].laz){
		dat[lson].sum += (dat[o].laz * (mid - l + 1));
		dat[rson].sum += (dat[o].laz * (r - mid));
		dat[lson].laz += dat[o].laz;
		dat[rson].laz += dat[o].laz;
	}                        
	dat[o].laz = 0;    
	return ;
}

void modify(ll o, ll l, ll r, ll ql, ll qr, ll v){
	if(l >= ql and r <= qr){
		dat[o].sum += (v * (r - l + 1));
		dat[o].laz += v;
		return ;
	}
	pushdown(o, l, r);
	if(ql <= mid) modify(lson, l, mid, ql, qr, v);
	if(qr > mid) modify(rson, mid + 1, r, ql, qr, v);
	update(o);
	return ;
}

ll query(ll o, ll l, ll r, ll ql, ll qr){
	if(l >= qr and r <= qr) return dat[o].sum;
	pushdown(o, l, r);
	ll res = 0;
	if(ql <= mid) res += query(lson, l, mid, ql, qr);
	if(qr > mid) res += query(rson, mid + 1, r, ql, qr);
	return res;
}                                                    

int main(){
	n = read(), q = read();
	for(ll i = 1; i <= n; i++){
		a[i] = read();
	}
	build(1, 1, n);
	while(q--){
		ll op = read();
		if(op == 1){
			ll x = read(), y = read(), z = read();
			modify(1, 1, n, x, y, z);
		}
		else if(op == 2){
			ll x = read(), y = read();
			cout << query(1, 1, n, x, y) << '\n';
		}
	}
	return 0;
}
2022/1/29 00:39
加载中...