#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = (int)1e5 + 10;
struct Node
{
long long sum;
int add;//延遲標記
int left, right;
int mid() { return (left + right) >> 1; }
} Tree[MAXN << 2];
int a[MAXN];
void buildTree(int i, int l, int r)
{
Tree[i].add = 0;
Tree[i].left = l;
Tree[i].right = r;
if (l == r)
{
Tree[i].sum = a[l];
return;
}
int m = Tree[i].mid();
buildTree(i << 1, l, m);
buildTree(i << 1 | 1, m + 1, r);
Tree[i].sum = Tree[i << 1].sum + Tree[i << 1 | 1].sum;
}
void push_up(int i)
{
Tree[i].sum = Tree[i << 1].sum + Tree[i << 1 | 1].sum;
}
void push_down(int i)
{
int lchild = i << 1;
int rchild = i << 1 | 1;
if (Tree[i].add)
{
Tree[lchild].add += Tree[i].add;
Tree[rchild].add += Tree[i].add;
Tree[lchild].sum += (long long)Tree[i].add * (Tree[lchild].right - Tree[lchild].left + 1);
Tree[rchild].sum += (long long)Tree[i].add * (Tree[rchild].right - Tree[rchild].left + 1);
Tree[i].add = 0;
}
}
void updata(int i, int c, int l, int r)
{
if (Tree[i].left == l && Tree[i].right == r)
{
Tree[i].add += c;
Tree[i].sum += (long long)c * (r - l + 1);
return;
}
if (Tree[i].left == Tree[i].right)
return;
push_down(i);
int m = Tree[i].mid();
if (r <= m)
updata(i << 1, c, l, r);
else if (l > m)
updata(i << 1 | 1, c, l, r);
else
{
updata(i << 1, c, l, m );
updata(i << 1 | 1, c, m + 1, r);
}
push_up(i);
}
long long query(int i, int l, int r)
{
if (Tree[i].left == l && Tree[i].right == r)
{
return Tree[i].sum;
}
push_down(i);
int m = Tree[i].mid();
if (r <= m)
{
return query(i << 1, l, r);
}
else if (l > m)
{
return query(i << 1 | 1, l, r);
}
else
{
return query(i << 1, l, m) + query(i << 1 | 1, m + 1, r);
}
}
int main(void)
{
ios::sync_with_stdio(false);
int N, Q, x, y, c;
char op;
while (cin >> N >> Q)
{
for (int i = 1; i <= N; ++i)
cin >> a[i];
buildTree(1, 1, N);
while (Q--)
{
cin >> op >> x >> y;
if (op == 'Q')
cout << query(1, x, y) << endl;
else
{
cin >> c;
updata(1, c, x, y);
}
}
}
return 0;
}
poj 3468 線段樹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.