#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n,m,a[N],b[N];
void insert(int l,int r,int c)
{
b[l] += c;
b[r + 1] -= c;
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n;i++) insert(i,i,a[i]);
while(m--)
{
int l,r,c;
cin >> 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++) cout << b[i] << ' ';
return 0;
}
差分为前缀和的逆运算
若数组a为{ ,1,2,4,5,9,10};
则数组b为{ ,1,1,2,1,4,1};
数组a为b的前缀和,数组b为a的差分。
注意在存储数组时和前缀和一样需要将首位数组空出方便计算。
该模板的insert函数很巧妙。