社区讨论

分块70分求助

P3368【模板】树状数组 2参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo9irjy0
此快照首次捕获于
2023/10/28 12:05
2 年前
此快照最后确认于
2023/10/28 12:05
2 年前
查看原帖
CPP
#include <iostream>
#include <cmath>

using namespace std;

int n, q, a[50005], block[50005], add[50005], st[50005], ed[50005], sq;

void ad(int l, int r, int c)
{
	int lb = block[l], rb = block[r];
	if (lb == rb)
	{
		for (int i = l ; i <= r ; i ++)
		{
			a[i] += c;
		}
		return ;
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		add[i] += c;
	}
	for (int i = l ; i <= ed[lb] ; i ++)
	{
		a[i] += c;
	}
	for (int i = st[rb] ; i <= r ; i ++)
	{
		a[i] += c;
	}
}

int main()
{
	cin >> n >> q;
	sq = sqrt(n);
	for (int i = 1 ; i <= n ; i ++)
	{
		scanf("%d", &a[i]);
		if (!st[i / sq + 1])
		{
			st[i / sq + 1] = i;
		}
		ed[i / sq + 1] = i;
		block[i] = i / sq + 1;
	}
	for (int i = 1 ; i <= q ; i ++)
	{
		int opt;
		scanf("%d", &opt);
		if (opt == 1)
		{
		    int l, r, c;
		    scanf("%d%d%d", &l, &r, &c);
			ad(l, r, c);
		}
		else
		{
		    int x;
		    scanf("%d", &x);
			printf("%d\n", a[x] + add[block[x]]);
		}
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...