线段树 RE 0分求助
查看原帖
线段树 RE 0分求助
778022
yhylivedream楼主2023/7/7 21:36
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
typedef long long ll;
ll a[N], w[N * 4], lzy[N * 4];
void push(int u){ w[u] = w[u << 1] + w[u << 1 + 1]; }
void build(int u, int l, int r){
	if(l == r){ w[u] = a[l]; return; }
	int m = (l + r) / 2;
	build(u * 2, l, m); build(u * 2 + 1, m + 1, r); push(u);
}
void mtag(int u, int len, ll x){
	lzy[u] += x;
	w[u] += len * x; 
}
void pushd(int u, int l, int r){
	int m = (l + r) / 2;
	mtag(u * 2, m - l + 1, lzy[u]);
	mtag(u * 2 + 1, r - m, lzy[u]);
	lzy[u] = 0;
}
ll query(int u, int n, int m, int l, int r){
	if((l <= n) && (m <= r)) return w[u];
	else if(!((n > r) || (m < l))){
		int t = (l + r) / 2;
		pushd(u, n, m);
	    return query(u * 2, n, t, l, r) + query(u * 2 + 1, t + 1, m, l, r);
	}
	else return 0;
}
void update(int u, int n, int m, int l, int r, ll x){
	if((l <= n) && (m <= r))
	    mtag(u, m - n + 1, x);
	else if(!((n > r) || (m < l))){
	    int t = (l + r) / 2;
		pushd(u, n, m);
		update(u * 2, n, m, l, r, x);
		update(u * 2 + 1, t + 1, m, l, r, x);
		push(u);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	int n, m;
	cin >> n >> m; 
	for(int i=1; i<=n; i++)
	    cin >> a[i];
	build(1, 1, n);
	for(int i=1; i<=m; i++){
		ll k;
		int type, x, y;
		cin >> type;
		if(type == 1){
			cin >> x >> y >> k;
			update(1, 1, n, x, y, k);
		}
		else{
			cin >> x >> y;
			cout << query(1, 1, n, x, y) << "\n";
		}
	}
	return 0;
}


2023/7/7 21:36
加载中...