# 差分
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N], b[N];
void insert(int l, int r, int c){
b[l] += c;
b[r + 1] -= c;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) insert(i, i, a[i]);
while(m--){
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
for(int i = 1; i <= n; i++) b[i] += b[i - 1];
for(int i = 1; i <= n; i++) printf("%d ", b[i]);
return 0;
}
//差分就是前缀和的逆运算
//如果想让差分数组 + 上一个数的话 就可以让bl + c, br + 1 - c 就可以了
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N], b[N];
void insert(int l, int r, int c){
b[l] += c;
b[r + 1] -= c;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) insert(i, i, a[i]);
//1 2 2 1 2 1
//这里是将构造差分数组看成一次次的插入操作
//b[i] = a[i]没错
//但是b[i + 1]不是a[i + 1],而是a[i + 1] - a[i]
//insert函数用在这就相当于b[i]=a[i],b[i + 1] = - a[i]。
while(m--){
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
for(int i = 1; i <= n; i++) b[i] += b[i - 1];
//求前缀和
for(int i = 1; i <= n; i++) printf("%d ", b[i]);
return 0;
}
# 细说?
b [i] = a [i] 没错,但是 b [i + 1] 不是 a [i + 1],而是 a [i + 1] - a [i]。
insert 函数用在这就相当于 b [i]=a [i], b [i + 1] = - a [i]。
弔