RE 求调
查看原帖
RE 求调
718169
__int127楼主2024/6/10 22:20
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define ll long long
#define endl cout << "\n"
const int N = 1e6 + 5;
int T = 1, n, m, a[N];
struct node{
	int L, R, w, tag;
}tree[N * 4];
void pushup(int u){
	tree[u].w = tree[u * 2].w + tree[u * 2 + 1].w;
}
void build(int u, int L, int R){
	if (L == R){
		tree[u].w = a[L];
		return;
	}
	int m = (L + R) / 2;
	build(u * 2, L, m);
	build(u * 2 + 1, m + 1, R);
	pushup(u);
}
void maketag(int u, int len, ll x){
	tree[u].tag += x;
	tree[u].w += x * len;
}
void pushdown(int u, int L, int R){
	int m = (L + R) / 2;
	maketag(u * 2, m - L + 1, tree[u].tag);
	maketag(u * 2 + 1, R - m, tree[u].tag);
	tree[u].tag = 0;
}
bool in(int l, int r, int L, int R){
	return (l <= L) && (R <= r);
}
bool out(int l, int r, int L, int R){
	return (L > r) || (R < l);
}
int query(int u, int L, int R, int l, int r){
	if (in(l, r, L, R)){
		return tree[u].w;
	} else if (!out(l, r, L, R)){
		int m = (L + R) / 2;
		pushdown(u, L, R);
		return query(u * 2, L, m, l, r) + query(u * 2 + 1, m + 1, R, l, r);
	}
}
void update(int u, int L, int R, int l, int r, ll x){
	if (in(l, r, L, R)){
		maketag(u, R - L + 1, x);
	} else if (!out(l, r, L, R)){
		int m = (L + R) / 2;
		pushdown(u, L, R);
		update(u * 2, L, m, l, r, x);
		update(u * 2 + 1, m + 1, R, l, r, x);
		pushup(u);
	}
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	//cin >> T;
	while (T--){
		cin >> n >> m;
		for (int i = 1; i <= n; i++){
			cin >> a[i];
		}
		build(1, 1, n);
		int op, l, r, k;
		while (m--){
			cin >> op >> l >> r;
			if (op == 1){
				cin >> k;
				update(1, 1, n, l, r, k);
			} else {
				cout << query(1, 1, n, l, r);
				endl;
			}
		}
    }
	return 0;
}
2024/6/10 22:20
加载中...