求大神修改代码
查看原帖
求大神修改代码
238885
Fat_Fish楼主2020/10/7 21:16
#include <iostream>

using namespace std;

const int MAX = 100000;

struct range {
	unsigned int left;
	unsigned int right;
	int v;
	int max;
	int min;
	int sum;	
} tree[MAX];

// 更新指定位置上的值
void _rangeupdate(unsigned int position, int value, unsigned int root) {
	if (tree[root].left == tree[root].right) {
		tree[root].v = value;
		tree[root].max = value;
		tree[root].min = value;
		tree[root].sum = value;
		return;
	}
	
	unsigned int mid = (tree[root].left + tree[root].right) / 2;
	if (position > mid) {
		_rangeupdate(position, value, root*2+2);
	} else {
		_rangeupdate(position, value, root*2+1);
	}
	
	tree[root].max = max(tree[root*2+1].max, tree[root*2+2].max);
	tree[root].min = min(tree[root*2+1].min, tree[root*2+2].min);
	tree[root].sum = tree[root*2+1].sum + tree[root*2+2].sum;
}

// 区间和
int _rangesum(unsigned int left, unsigned int right, unsigned int root) {
	if (left == root && right == root) {
		return tree[root].sum;
	}

	unsigned int mid = (tree[root].left + tree[root].right ) / 2;
	
	if (left > mid) {
		return _rangesum(left, right, root*2+2);
	} else if (right <= mid) {
		return _rangesum(left, right, root*2+1);
	} 
	
	return _rangesum(left, mid, root*2+1) + _rangesum(mid+1, right, root*2+2);	
}

// 创建区间
void buildrange(unsigned int root, int data[], unsigned int left, unsigned int right) {
	tree[root].left = left;
	tree[root].right = right;
	
	if (left == right) {
		tree[root].max = data[left];
		tree[root].min = data[left];
		tree[root].sum = data[left];
		return;
	} else {
		unsigned int mid = (left + right) / 2;
		buildrange(root*2+1, data, left, mid);
		buildrange(root*2+2, data, mid+1, right);
		tree[root].max = max(tree[root*2+1].max, tree[root*2+2].max);
		tree[root].min = min(tree[root*2+1].min, tree[root*2+2].min);
		tree[root].sum = tree[root*2+1].sum + tree[root*2+2].sum;
		return;
	}
}

// 更新区间指定位置的值
void updaterange(unsigned int position, int value) {
	_rangeupdate(position, value, 0);
}

int rangesum(unsigned int left, unsigned int right) {
	return _rangesum(left, right, 0);
}

int main(int argc, char *argv[]) {
	int n,m;
	cin >> n>>m;
	int data[n];
	
	for (int i=0; i<n; ++i) {
		cin >> data[i];
	}
	
	buildrange(0, data, 0, n-1);
	
	while(m--) {
		int s,x,y,k;
		cin>>s;
		if(s==1){
			cin>>x>>y>>k;
			for(int i=x-1;i<y;++i){
				updaterange(i,data[i]+k);
			}
		}
		else if(s==2){
			cin>>x>>y;
			cout<<rangesum(x-1,y-1)<<'\n';
		}
	}
	
	return 0;
}
2020/10/7 21:16
加载中...