树状数组满江红 求调
查看原帖
树状数组满江红 求调
812890
fanwenbing楼主2023/10/24 23:00
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstring>
#include<map>
#include<unordered_map>
#include<unordered_set>
#define lowbit(x) x&-x
#define int long long
#define ll long long
#define pii pair<int,int>
#define ull unsigned long long
#define maxn 2000010
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
int a[maxn], di[maxn], dii[maxn];
int n, m;
void add(int st, int x)
{
	for (int i = st; i <= n; i += lowbit(i))
		di[i] += x, dii[i] += x * st;
}
int query(int x)
{
	int ans = 0;
	for (int i = x; i >= 1; i -= lowbit(i))
		ans += (x + 1) * di[i] - dii[i];

	return ans;
}
void solve()
{

	cin >> n >> m;

	for (int i = 1; i <= n; i++) cin >> a[i];

	//建立di和dii差分数组
	for (int i = 1; i <= n; i++)
		add(i, a[i] - a[i - 1]);

	int mian = a[1];

	while (m--)
	{
		int a;
		int l, r, d;

		cin >> a;

		if (a == 1) {
			cin >> l >> r >> d;
			add(l, d);
			add(r + 1, -d);
		}
		else if (a == 2)
		{
			cin >> d;
			mian += d;
		}
		else if (a == 3)
		{
			cin >> d;
			mian -= d;
		}
		else if (a == 4)
		{
			cin >> l >> r;
			cout << query(r) - query(l - 1) + (l == 1) * mian << '\n';

		}
		else cout << query(1) + mian << '\n';

	}

}
signed main()
{
	IOS;

	int K;

	K = 1;

	//cin >> K;

	while (K--) solve();

	return 0;
}
2023/10/24 23:00
加载中...