#include<bits/stdc++.h>
using namespace std;
int a[500005];
int t1[500005],t2[500005];
int n,m;
int lowbit(int x){
return x & -x;
}
void add(int x,int k){//t1,t2数组的加减;
int v1 = x * k;
while(x <= n){
t1[x] += k;
t2[x] += v1;
x += lowbit(x);
}
}
int getsum(int t[],int x){
int ans = 0;
while(x){
ans += t[x];
x -= lowbit(x);
}
return ans;
}
void add1(int l,int r,int v){
add(l,v);
add(r + 1,-v);
}//差分= =
long long getsum1(int l,int r){
return (r + 1ll) * getsum(t1,r) - 1ll * l * getsum(t1,l - 1) - (getsum(t2,r) - getsum(t2,l - 1));
}//区间求和
void init(){
for(int i = 1 ; i <= n + 1; i++){
add(i,a[i] - a[i - 1]);//这里是我之前犯的错误 前缀差也要用树状的形式初始化
}
for(int i = 1; i <= n + 1; i++){
t2[i] = t1[i];
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
init();
int s,x,y,k;
for(int i = 1; i <= m; i++){
scanf("%d",&s);
if(s == 1){
scanf("%d%d%d",&x,&y,&k);
add1(x,y,k);
}else{
scanf("%d",&x);
printf("%d\n",getsum(t1,x));
}
}
return 0;
}
我该怎么向以后的自己解释怎么理解的呢
上面的图示已经很好的表达了。。