树状数组模板

//简单模板

//下标从1开始
class BitTree{
	typedef long long int ll;
public:
	BitTree(int cnt){
		n = cnt;
		bt.assign(n, 0);
	}
	ll lowbit(int x){
		return x & -x;
	}
	void add(ll idx, ll value){
		for (int i = idx; i < n; i += lowbit(i)){
			bt[i] = (bt[i] + value);
		}
	}
	ll _sum(ll idx){
		ll ret = 0;
		for (int i = idx; i; i -= lowbit(i)){
			ret += bt[i];
		}
		return ret;
	}
	ll sum(ll l, ll r){
		return _sum(r) - _sum(l - 1);
	}
private:
	vector<ll> bt;
	ll n;
};

//带更新

//下标从1开始
class BitTree{
	typedef long long int ll;
public:
	BitTree(int cnt){
		n = cnt;
		bt.assign(n, 0);
		v.assign(n, 0);
	}
	ll lowbit(int x){
		return x & -x;
	}
	void add(ll idx, ll value){
		for (int i = idx; i < n; i += lowbit(i)){
			bt[i] = (bt[i] + value);
		}
		v[idx] += value;
	}
	void update(ll idx, ll value){
		add(idx, -v[idx]);
		add(idx, value);
	}

	ll _sum(ll idx){
		ll ret = 0;
		for (int i = idx; i; i -= lowbit(i)){
			ret += bt[i];
		}
		return ret;
	}
	ll sum(ll l, ll r){
		return _sum(r) - _sum(l - 1);
	}
private:
	vector<ll> bt;
	vector<ll> v;
	ll n;
};

区间修改
树状数组 + 差分数组

//下标从1开始
class BitTree{
	typedef long long int ll;
public:
	BitTree(int cnt){
		n = cnt;
		bt.assign(n, 0);
	}
	ll lowbit(int x){
		return x & -x;
	}
	void add(ll idx, ll value){
		for (int i = idx; i < n; i += lowbit(i)){
			bt[i] = (bt[i] + value);
		}
	}
	ll _sum(ll idx){
		ll ret = 0;
		for (int i = idx; i; i -= lowbit(i)){
			ret += bt[i];
		}
		return ret;
	}
	ll sum(ll l, ll r){
		return _sum(r) - _sum(l - 1);
	}
private:
	vector<ll> bt;
	ll n;
};

int n, m;

void slove(){
	cin >> n >> m;
	BitTree bit(n + 10);
	int a, b, c,d,last = 0;
	//差分数组 a[i] - a[i - 1];
	for (int i = 1; i <= n; i++){
		cin >> a;
		bit.add(i, a - last);
		last = a;
	}

	for (int i = 1; i <= m; i++){
		cin >> a >> b;
		//区间修改
		if (a == 1){
			cin >> c >> d;
			bit.add(b, d);
			bit.add(c + 1, -d);
		}
		else {
			cout << bit.sum(1, b) << endl;
		}
	}
}
int main(){
	slove();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值