萌新刚学OI,这个树状数组打炸了
查看原帖
萌新刚学OI,这个树状数组打炸了
133426
stone_juice石汁楼主2019/8/7 19:23

板子题:

区间修改,单点查询,样例都没过

本来想肝主席树结果发现树状数组都打崩了,我太蒟了

#include<bits/stdc++.h>
#define mian main
#define QWQ puts("QWQ");
using namespace std;

int n, m;
int tree[500005];

int lowbit(int x)//求lowbit:2进制下末尾0的个数。可表示tree中包含数据数量 
{
	return x & -x;
}

void _add(int x, int k)
{
	for(;x <= n; x += lowbit(x))
		tree[x] += k;
}

long long _find(int x)
{
	long long ans = 0;
	for(;x > 0; x -= lowbit(x))
		ans += tree[x];
	return ans;
}

int main()
{
    scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i ++) 
	{
		long long k, lk = 0;
		scanf("%lld", &k);
		_add(i, k - lk);
		lk = k;//差分
	}
	for(int i = 1; i <= m; i ++)
	{
		int p; 
		long long x, y, k;
		scanf("%d", &p);
		if(p == 1)
		{
			scanf("%lld%lld%lld", &x, &y, &k);
			_add(x, k);
			_add(y + 1, -k);//修改头尾。因为中间差未变 
		}
		else
		{
			scanf("%lld", &x); 
			printf("%lld\n", _find(x));//因为是差分所以前x项差分和就为所求数 
		}
	}
	return 0;
}
2019/8/7 19:23
加载中...