//简单模板
//下标从1开始
class BitTree{
typedef long long int ll;
public:
BitTree(int cnt){
n = cnt;
bt.assign(n, 0);
}
ll lowbit(int x){
return x & -x;
}
void add(ll idx, ll value){
for (int i = idx; i < n; i += lowbit(i)){
bt[i] = (bt[i] + value);
}
}
ll _sum(ll idx){
ll ret = 0;
for (int i = idx; i; i -= lowbit(i)){
ret += bt[i];
}
return ret;
}
ll sum(ll l, ll r){
return _sum(r) - _sum(l - 1);
}
private:
vector<ll> bt;
ll n;
};
//带更新
//下标从1开始
class BitTree{
typedef long long int ll;
public:
BitTree(int cnt){
n = cnt;
bt.assign(n, 0);
v.assign(n, 0);
}
ll lowbit(int x){
return x & -x;
}
void add(ll idx, ll value){
for (int i = idx; i < n; i += lowbit(i)){
bt[i] = (bt[i] + value);
}
v[idx] += value;
}
void update(ll idx, ll value){
add(idx, -v[idx]);
add(idx, value);
}
ll _sum(ll idx){
ll ret = 0;
for (int i = idx; i; i -= lowbit(i)){
ret += bt[i];
}
return ret;
}
ll sum(ll l, ll r){
return _sum(r) - _sum(l - 1);
}
private:
vector<ll> bt;
vector<ll> v;
ll n;
};
区间修改
树状数组 + 差分数组
//下标从1开始
class BitTree{
typedef long long int ll;
public:
BitTree(int cnt){
n = cnt;
bt.assign(n, 0);
}
ll lowbit(int x){
return x & -x;
}
void add(ll idx, ll value){
for (int i = idx; i < n; i += lowbit(i)){
bt[i] = (bt[i] + value);
}
}
ll _sum(ll idx){
ll ret = 0;
for (int i = idx; i; i -= lowbit(i)){
ret += bt[i];
}
return ret;
}
ll sum(ll l, ll r){
return _sum(r) - _sum(l - 1);
}
private:
vector<ll> bt;
ll n;
};
int n, m;
void slove(){
cin >> n >> m;
BitTree bit(n + 10);
int a, b, c,d,last = 0;
//差分数组 a[i] - a[i - 1];
for (int i = 1; i <= n; i++){
cin >> a;
bit.add(i, a - last);
last = a;
}
for (int i = 1; i <= m; i++){
cin >> a >> b;
//区间修改
if (a == 1){
cin >> c >> d;
bit.add(b, d);
bit.add(c + 1, -d);
}
else {
cout << bit.sum(1, b) << endl;
}
}
}
int main(){
slove();
return 0;
}