用树状数组维护一个差分数组,sum(x)即表示数x
注意一开始存储数据的方式
修改区间[x, y]时只要add(x, d), add(y+1, -d)即可
// Decline is inevitable,
// Romance will last forever.
//#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <deque>
#include <vector>
using namespace std;
#define mst(a, x) memset(a, x, sizeof(a))
#define INF 0x3f3f3f3f
//#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define ll long long
//#define int long long
const int maxn = 5e5 + 10;
const int maxm = 25;
const int P = 1e9 + 7;
int C[maxn], n, m;
int lb(int x) {
return x & -x;
}
int sum(int x) { //前x组的和
int ret = 0;
while(x) {
ret += C[x];
x -= lb(x);
}
return ret;
}
void add(int x, int d) { //第x组加d
while(x <= n) {
C[x] += d;
x += lb(x);
}
}
int t = 0;
void solve() {
scanf("%d%d", &n, &m);
int last = 0;
for(int i = 1; i <= n; i++) {
int a;
scanf("%d", &a);
add(i, a - last);
last = a;
}
while(m--) {
int x, y;
scanf("%d%d", &x, &y);
if(x & 1) {
int k, q;
scanf("%d%d", &k, &q);
add(y, q);
add(k+1, -q);
}
else{
printf("%d\n", sum(y));
}
}
}
signed main() {
// ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// int T; scanf("%d", &T); while(T--)
// int T; cin >> T; while(T--)
solve();
return 0;
}