//代码含全角空格
#include <iostream>
#include <cstdio>
using namespace std;
const int N=100010;
long long a[N],b[N],query[N],sumq[N];
int n,m,k,x,y;
struct state{
int l,r,d;
}op[N];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++) {
scanf("%I64d",&a[i]);
b[i]=a[i]-a[i-1];//差分
}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op[i].l,&op[i].r,&op[i].d);
}
while(k--){
scanf("%d%d",&x,&y);
query[x]++;query[++y]--;//++y
}
for(int i=1;i<=m;i++){
sumq[i]=query[i]+sumq[i-1];//差分
b[op[i].l]+=sumq[i]*op[i].d;
b[op[i].r+1]-=sumq[i]*op[i].d;//op[i].r+1
}
for(int i=1;i<=n;i++){
a[i]=a[i-1]+b[i];
printf("%I64d ",a[i]);
}
cout<<endl;
return 0;
}
/*思路:
用两次差分数列, 先处理出对于每个op调用了几次, 再对数列执行操作.*/