正常来说4倍空间就够了,但是我开4倍空间的话,最后三个点re,只有开8倍空间才ac,这是为啥啊 以下是代码
#include <cstdio>
#include <iostream>
#define ll long long
#define MAXN 100005
using namespace std;
struct node
{
ll l, r;
ll sum;
ll lazy;
} tree[4*MAXN];
int arry[MAXN];
void updateNode(int x)
{
tree[x].sum = tree[2 * x].sum + tree[2 * x + 1].sum;
}
void build(int lf, int rg, int n)
{
tree[n].l = lf;
tree[n].r = rg;
tree[n].lazy = 0;
if (lf == rg)
{
tree[n].sum = arry[lf];
return;
}
int mid = (lf + rg) >> 1;
build(lf, mid, 2 * n);
build(mid + 1, rg, 2 * n + 1);
updateNode(n);
}
void pushDown(int n)
{
if (tree[n].lazy)
{
tree[2 * n].lazy += tree[n].lazy;
tree[2 * n + 1].lazy += tree[n].lazy;
tree[2 * n].sum += (ll)(tree[2 * n].r - tree[2 * n].l + 1) * tree[n].lazy;
tree[2 * n + 1].sum += (ll)(tree[2 * n + 1].r - tree[2 * n + 1].l + 1) * tree[n].lazy;
tree[n].lazy = 0;
}
}
void updateInterval(int lf, int rg, int add, int n)
{
if ((tree[n].l > rg) || (tree[n].r < lf))
return;
if (tree[n].l >= lf && tree[n].r <= rg)
{
tree[n].sum += (ll)add * (tree[n].r - tree[n].l + 1);
tree[n].lazy += add;
return;
}
pushDown(n);
updateInterval(lf, rg, add, 2 * n);
updateInterval(lf, rg, add, 2 * n + 1);
updateNode(n);
}
ll quire(int lf, int rg, int n)
{
if ((tree[n].l > rg) || (tree[n].r < lf))
return 0;
pushDown(n);
if (tree[n].l >= lf && tree[n].r <= rg)
return tree[n].sum;
ll tmp = 0;
tmp += quire(lf, rg, 2 * n);
tmp += quire(lf, rg, 2 * n + 1);
return tmp;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &arry[i]);
}
build(1, n, 1);
for (int i = 0; i < m; i++)
{
int op = 0;
scanf("%d", &op);
if (op == 1)
{
int a, b, k;
scanf("%d%d%d", &a, &b, &k);
updateInterval(a, b, k, 1);
}
else if (op == 2)
{
int a, b;
scanf("%d%d", &a, &b);
printf("%lld\n", quire(a, b, 1));
}
}
return 0;
}