求差错
查看原帖
求差错
183026
Cocoly1990楼主2021/7/18 22:41

双树状数组,样例都过不去

#include<bits/stdc++.h>
#define ll long long
using namespace std ;
ll tree[2000007] , tree2[2000007] , n , m , a[100007] ;
ll lowbit(ll x)
{
	return x & (- x) ;
}
void add(ll x , ll y)
{
	while(x <= n)
	{
		tree[x] += y ;
		x += lowbit(x) ;
	}
}
ll sum(ll x)
{
	ll ans = 0 ;
	while(x)
	{
		ans += tree[x] ;
		x -= lowbit(x) ;
	}
	return ans ;
}
void add2(ll x , ll y)
{
	while(x <= n)
	{
		tree2[x] += y ;
		x += lowbit(x) ;
	}
}
ll sum2(ll x)
{
	ll ans = 0 ;
	while(x)
	{
		ans += tree2[x] ;
		x -= lowbit(x) ;
	}
	return ans ;
}
int main()
{
	cin >> n >> m ;
	ll x , y , k , ch ;

	for(ll i = 1 ; i <= n ; i ++)
	{
		cin >> x ;
		a[i] = a[i - 1] + x ;
	}
	for(ll i = 1 ; i <= m ; i ++)
	{
		cin >> ch ;
		if(ch == 1)
		{
			cin >> x >> y >> k ;
			add(x  , k) ;
			add2(y , k) ;
			//cout << sum(5) << " " << sum2(0) << endl ;//<< " " << a[y] - a[x - 1] << endl ;
			
		}
		else
		{
			cin >> x >> y ;
			//cout << sum(y) << " " << sum2(x - 1) << " " << a[y] - a[x - 1] << endl ;
			cout << sum(y) - sum2(x - 1) + a[y] - a[x - 1] << endl ;
		}
	}
	return 0 ;
}


2021/7/18 22:41
加载中...