# 差分

#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]。