思路:设b[i]为原数组的差分数组,给l,r这个区间加上d,即b[l]+d,b[r+1]-d,求某个x的值,即b[x]的前缀和,所以用一个树状数组来维护这这个差分数组就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m;
ll a[N],t[N];
ll lowbit(ll x)
{
return x&-x;
}
void add(int x,ll d)
{
for(int i=x;i<=n;i+=lowbit(i)) t[i]+=d;
}
ll ask(int x)
{
ll res=0;
for(int i=x;i;i-=lowbit(i)) res+=t[i];
return res;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
add(i,a[i]-a[i-1]);
}
for(int i=1;i<=m;i++)
{
char c;
scanf(" %c",&c);
int l,r,d;
scanf("%d",&l);
if(c=='C')
{
scanf("%d %d",&r,&d);
add(l,d);
add(r+1,-d);
}
else printf("%lld\n",ask(l));
}
return 0;
}