昨天又刷了一遍线段树的基础题,复习了一下模板,贴出来以便以后复习。
#include <iostream>
#include <cstdio>
#include <cstring>
#define mid ((l + r) >> 1)
#define lson id << 1
#define rson id << 1 | 1
using namespace std;
long long sum[1000010], lazy[1000010];
inline void PushUp(int id)
{
sum[id] = sum[lson] + sum[rson];
}
void Build(int l, int r, int id)
{
if(l == r)
{
scanf("%lld", &sum[id]);
return ;
}
Build(l, mid, lson);
Build(mid + 1, r, rson);
PushUp(id);
}
void PushDown(int id, int num)
{
lazy[lson] += lazy[id];
lazy[rson] += lazy[id];
sum[lson] += (num - num / 2) * lazy[id];
sum[rson] += (num / 2) * lazy[id];
lazy[id] = 0;
}
void Update(int l, int r, int id, int cl, int cr, long long v)
{
if(l > cr || r < cl)
return ;
if(lazy[id])
PushDown(id, r - l + 1);
if(l >= cl && r <= cr)
{
sum[id] += (r - l + 1) * v;
lazy[id] += v;
return ;
}
Update(l, mid, lson, cl, cr, v);
Update(mid + 1, r, rson, cl, cr, v);
PushUp(id);
}
long long QuerySum(int l, int r, int id, int ql, int qr)
{
if(l > qr || r < ql)
return 0;
if(lazy[id])
PushDown(id, r - l + 1);
if(l >= ql && r <= qr)
return sum[id];
return QuerySum(l, mid, lson, ql, qr) + QuerySum(mid + 1, r, rson, ql, qr);
}
int main()
{
int n, optimes;
long long add;
char c;
while(~scanf("%d %d", &n, &optimes))
{
memset(sum, 0, sizeof(sum));
memset(lazy, 0, sizeof(lazy));
Build(1, n, 1);
getchar();
int l, r;
while(optimes --)
{
scanf("%c", &c);
if(c == 'Q')
{
scanf("%d %d", &l, &r);
printf("%lld\n", QuerySum(1, n, 1, l, r));
}
if(c == 'C')
{
scanf("%d %d %lld", &l, &r, &add);
Update(1, n, 1, l, r, add);
}
getchar();
}
}
return 0;
}