#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <map>
#define maxn (1<<18) - 1
#define INF 0x7fffffff
#define PI acos(-1.0)
#define exp 1e-9
#define ll long long
using namespace std;
int da[maxn], db[maxn];
void add(int a, int b, int k, int x, int l, int r)
{
if(a <= l && r <= b) da[k] += x;
else if(a < r && b > l)
{
db[k] += (min(r, b) - max(a, l))*x;
add(a, b, k*2+1, x, l, (l+r)/2);
add(a, b, k*2+2, x, (l+r)/2, r);
}
return;
}
ll sum(int a, int b, int k, int l, int r)
{
if(b <= l || a >= r) return 0;
else if(a <= l && r <= b) return db[k] + da[k]*(r-l);
else{
ll ans = da[k]*(min(b, r) - max(a, l));
ans += sum(a, b, k*2+1, l, (l+r)/2);
ans += sum(a, b, k*2+2, (l+r)/2, r);
return ans;
}
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
memset(da, 0, sizeof(da));
memset(db, 0, sizeof(db));
int num;
for(int i = 0; i < n; ++i)
{
scanf("%d", &num);
add(i, i+1, 0, num, 0, n);
}
char order[3];
while(m--)
{
scanf("%s", order);
int i, j, x;
if(order[0] == 'C')
{
scanf("%d%d%d", &i, &j, &x);
add(i-1, j, 0, x, 0, n);
}
else if(order[0] == 'Q')
{
scanf("%d%d", &i, &j);
printf("%lld\n", sum(i-1, j, 0, 0, n));
}
}
}
return 0;
}
POJ 3468 A Simple Problem with Integers
最新推荐文章于 2023-10-02 10:26:46 发布