0pts求助,调了一晚上了,救救我
查看原帖
0pts求助,调了一晚上了,救救我
670998
Neven楼主2023/7/25 12:28
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m, num[N], op, x, y, k;
struct node{
	int lft, rgt, sum, lazy;
}tree[N * 4];
void build(int pos, int l, int r){
	tree[pos].lft = l, tree[pos].rgt = r;
	if(l == r){
		tree[pos].sum = num[l];
		return;
	}
	int mid = l + r >> 1;
	build(pos << 1, l, mid);
	build((pos << 1) + 1, mid + 1, r);
	tree[pos].sum = tree[pos << 1].sum + tree[(pos << 1) + 1].sum;
}
void push_down(int pos){
	if(!tree[pos].lazy) return;
	tree[pos << 1].lazy = tree[(pos << 1) + 1].lazy = tree[pos].lazy;
	int mid = tree[pos].lft + tree[pos].rgt >> 1;
	tree[pos << 1].sum += tree[pos].lazy * (mid - tree[pos << 1].lft + 1);
	tree[(pos << 1) + 1].sum = tree[pos].lazy * (tree[(pos << 1) + 1].rgt - mid);
	tree[pos].lazy = 0;
}
void add(int pos, int l, int r, int num){
	if(tree[pos].lft >= l && tree[pos].rgt <= r){
		tree[pos].sum += num * (tree[pos].rgt - tree[pos].lft + 1);
		tree[pos].lazy += num;
		return;
	}
	push_down(pos);
	int mid = tree[pos].lft + tree[pos].rgt >> 1;
	if(l <= mid) add(pos << 1, l, r, k);
	if(r > mid) add((pos << 1) | 1, l, r, k);
}
int search(int pos, int l, int r){
	if(tree[pos].lft >= l && tree[pos].rgt <= r){
		return tree[pos].sum;
	}
	if(tree[pos].lft > r || tree[pos].rgt < l) return 0;
	push_down(pos);
	return search(pos << 1, l, r) + search((pos << 1) + 1, l, r);
}
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> num[i];
	}
	build(1, 1, n);
	while(m--){
		cin >> op >> x >> y;
		if(op == 1){
			cin >> k;
			add(1, x, y, k);
		}else{
			cout << search(1, x, y + 1) << endl;
		}
	}
	return 0;
}
2023/7/25 12:28
加载中...