永久化标记求调
查看原帖
永久化标记求调
701221
Chr0n1CleC楼主2022/9/29 21:12
#include<stdio.h>
#define N 100009
#define ls (p << 1)
#define rs (ls + 1)

int a[N];

int tree[N << 2], lazy[N << 2];

void build(int l, int r, int p = 1)
{
	if (l == r)
	{
		tree[p] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, ls);
	build(mid + 1, r, rs);
	tree[p] = tree[ls] + tree[rs];
}

void updata(int sl, int sr, int l, int r, int k, int p = 1)
{
	tree[p] += (sr - sl + 1) * k;
	if (l == sl && r == sr)
	{
		lazy[p] += k;
		return;
	}
	int mid = (l + r) >> 1;
	if (sl <= mid)
		updata(sl, sr, l, mid, k, ls);
	else if (sr > mid)
		updata(sl, sr, mid + 1, r, k, rs);
	else
		updata(sl, mid, l, mid, k, ls), updata(mid + 1, sr, mid + 1, r, k, rs);
}

int query(int sl, int sr, int l, int r, int p = 1, int sum = 0)
{
	if (l == sl && r == sr)
		return tree[p] + (sr - sl + 1) * sum;
	int mid = (l + r) >> 1;
	sum += lazy[p];
	if (sl <= mid)
		return query(sl, sr, l, mid, ls, sum);
	else if (sr > mid)
		return query(sl, sr, mid + 1, r, rs, sum);
	else
		return query(sl, mid, l, mid, rs, sum) + query(mid + 1, sr, mid + 1, r, rs, sum);
}

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1;i <= n;++ i)
		scanf("%d", &a[i]);
	build(1, n);
	int opt, l, r, x;
	while (m --)
	{
		scanf("%d%d%d", &opt, &l, &r);
		if (opt == 1)
			scanf("%d", &x), updata(l, r, 1, n, x);
		else
			printf("%d\n", query(l, r, 1, n)); 
	}
	
	return 0;
}
2022/9/29 21:12
加载中...