一个简单的整数问题2
- 题目
- 提交记录
- 讨论
- 题解
- 视频讲解
给定一个长度为 NN 的数列 AA,以及 MM 条指令,每条指令可能是以下两种之一:
C l r d
,表示把 A[l],A[l+1],…,A[r]A[l],A[l+1],…,A[r] 都加上 dd。Q l r
,表示询问数列中第 l∼rl∼r 个数的和。
对于每个询问,输出一个整数表示答案。
输入格式
第一行两个整数 N,MN,M。
第二行 NN 个整数 A[i]A[i]。
接下来 MM 行表示 MM 条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤1051≤N,M≤105,
|d|≤10000|d|≤10000,
|A[i]|≤109|A[i]|≤109
输入样例:
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
输出样例:
4
55
9
15
#include <iostream>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int n,m;
ll tr1[N],tr2[N];
int a[N],b[N];
int lowbit(int x)
{
return x&(-x);
}
void add(ll tr[],int x,ll c)
{
for(int i=x;i<=n;i+=lowbit(i))
tr[i]+=c;
}
ll sum(ll tr[],int x)
{
ll res=0;
for(int i=x;i;i-=lowbit(i))
res+=tr[i];
return res;
}
ll ans(int x)
{
return sum(tr1,x)*(x+1)-sum(tr2,x);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i]-a[i-1];
add(tr1,i,b[i]);
add(tr2,i,(ll)b[i]*i);
}
while(m--)
{
string s;
int l,r;
cin>>s>>l>>r;
if(s=="Q")
{
cout<<ans(r)-ans(l-1)<<endl;
}
if(s=="C")
{
int c;
cin>>c;
add(tr1,l,c);
add(tr1,r+1,-c);
add(tr2,l,l*c);
add(tr2,r+1,(r+1)*(-c));
}
}
}