社区讨论
分块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 条回复,欢迎继续交流。
正在加载回复...