树状数组悬关求调~~~~~
查看原帖
树状数组悬关求调~~~~~
868063
_Coffice_楼主2023/7/6 16:30
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
const int N = 100005;
int a[N], b[N], s[N];
int t[2][N];
int n, m;
int lowbit(int x) { return (x & (-x)); }
void add(int k, int x, int y)
{
	for(int i=x;i<=n;i+=lowbit(i))
		t[k][i] += y;
}
int sum(int k, int x)
{
	int ans = 0;
	for(int i=x;i>=1;i-=lowbit(i))
		ans += t[k][i];
	return ans;
}
void upd(int l, int r, int x)
{
	add(0, l, x);
	add(0, r+1, -x);
	add(1, l, l*x);
	add(1, r+1, -r*x);
}
int ask(int n)
{
	int a = sum(0, n);
	int b = sum(1, n);
	return (n+1)*a-b;
}
signed main() 
{
	cin >> n >> m;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
		b[i] = a[i]-a[i-1];
		s[i] = s[i-1]+b[i];
		t[0][i] = s[i]-s[i-lowbit(i)];
	}
	for(int i=1;i<=n;i++)
	{
		s[i] = s[i-1]+i*b[i];
		t[1][i] = s[i]-s[i-lowbit(i)];
	}
	for(int i=1;i<=m;i++)
	{
		int op;
		cin >> op;
		if(op == 1)
		{
			int x, y, k;
			cin >> x >> y >> k;
			upd(x, y, k);
		}
		else
		{
			int x, y;
			cin >> x >> y;
			cout << ask(y)-ask(x-1) << endl;
		}
	}
	return 0;
}

记录

2023/7/6 16:30
加载中...