//差分是前缀和的逆运算,前缀和是把原数组表示成两个前缀和数组的差
//而差分,把原数组表示为差分数组的前缀和,在原数组l-r的区间内全部加上一个数
//等价于在差分数组的b[l]加上一个数,在b[r+1]再减去这个数
//所以我们首先要构造出这个差分数组b,这个就是问题的关键了
//前缀和的逆运算,a是和数组,所以b[n]=a[n]-a[n-1];
//后边有一个同学的写的比较明白,yxc的比较巧妙,但是难以理解
//构造差分数组b的时候,可以先假定原来的a数组全部是0,这样b也刚开始的时候全为0,差分数组也相当于构造好了
//然后输入a数组中的值的时候,相当于对a数组在原来的位置上进行了n次插入操作,所以
//当n个数据输入到a的时候,对应的差分数组b也就构造完成了
// #include<iostream>
// using namespace std;
// const int N=100010;
// 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;
// }
// //差分 时间复杂度 o(m),这个比较容易理解
// #include<iostream>
// using namespace std;
// const int N = 1e5 + 10;
// int a[N], b[N];
// int main()
// {
// int n, m;
// scanf("%d%d", &n, &m);
// for (int i = 1; i <= n; i++)
// {
// scanf("%d", &a[i]);
// b[i] = a[i] - a[i - 1]; //构建差分数组
// }
// int l, r, c;
// while (m--)
// {
// scanf("%d%d%d", &l, &r, &c);
// b[l] += c; //将序列中[l, r]之间的每个数都加上c
// b[r + 1] -= c;
// }
// for (int i = 1; i <= n; i++)
// {
// a[i] = b[i] + a[i - 1]; //前缀和运算
// printf("%d ", a[i]);
// }
// return 0;
// }
// 作者:z林深时见鹿
// 链接:https://www.acwing.com/solution/content/26588/
// 来源:AcWing
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#include<iostream>
using namespace std;
const int N=100010;
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()
{
cin>>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;
}