A Simple Problem with Integers
Description
You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
“C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000.
“Q a b” means querying the sum of Aa, Aa+1, … , Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
Hint
The sums may exceed the range of 32-bit integers.
题意:给出数列A,区间加,区间求和。
代码
#include <cstdio>
#include <string>
#include <cstring>
#define ll long long
#define N 500005
using namespace std;
struct tree
{
int l, r;
ll sum, lazy;
}tr[N];
int n,m,a[N];
ll ans;
void build(int p)
{
if (tr[p].l == tr[p].r)
{
tr[p].sum = a[tr[p].l];
return;
}
int mid = (tr[p].l + tr[p].r) / 2;
tr[p * 2].l = tr[p].l;
tr[p * 2].r = mid;
tr[p * 2 + 1].l = mid + 1;
tr[p * 2 + 1].r = tr[p].r;
build(p * 2);
build(p * 2 +1);
tr[p].sum = tr[p * 2].sum + tr[p * 2 + 1].sum;
}
void down(int p)
{
if (tr[p].lazy)
{
tr[p * 2].lazy+=tr[p].lazy;
tr[p * 2 + 1].lazy+=tr[p].lazy;
tr[p * 2].sum+=tr[p].lazy * (tr[p * 2].r - tr[p * 2].l + 1);
tr[p * 2 + 1].sum+=tr[p].lazy * (tr[p * 2 + 1].r - tr[p * 2 + 1].l + 1);
tr[p].lazy = 0;
}
}
void find(int p, int x, int y)
{
if (tr[p].l == x && tr[p].r == y)
{
ans+=tr[p].sum;
return;
}
down(p);
int mid = (tr[p].l + tr[p].r) / 2;
if (y <= mid) find(p * 2, x, y);
else if (x > mid) find(p * 2 + 1, x, y);
else find(p * 2, x, mid), find(p * 2 + 1, mid + 1, y);
}
void change(int p, int x, int y, int val)
{
if (tr[p].l == x && tr[p].r == y)
{
tr[p].sum+=(ll)val * (tr[p].r - tr[p].l + 1);
tr[p].lazy+=val;
return;
}
down(p);
int mid = (tr[p].l + tr[p].r) / 2;
if (y <= mid) change(p * 2, x, y, val);
else if (x > mid) change(p * 2 + 1, x, y, val);
else change(p * 2, x, mid, val), change(p * 2 + 1, mid + 1, y, val);
tr[p].sum = tr[p * 2].sum + tr[p * 2 + 1].sum;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
tr[1].l = 1;
tr[1].r = n;
build(1);
for (int i = 1; i <= m; i++)
{
char c;
scanf("%c", &c);
scanf("%c", &c);
if (c == 'Q')
{
int x, y;
scanf("%d%d", &x, &y);
ans = 0;
find(1, x, y);
printf("%lld\n", ans);
}
else
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
change(1, x, y, z);
}
}
}