rt,线段树+树状数组差分,第11个点WA了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e5+100;
int n,q,a[maxn],ma[maxn],sum[maxn],add[maxn],x[maxn],y[maxn],z[maxn],k,e,d,c[maxn],b[maxn];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline int lowbit(int x){
return x&-x;
}
inline void addd(int xx,int v){
for(int i=xx;i<=n;i+=lowbit(i)){
c[i]+=v;
}
}
inline int summ(int xx){
int s=0;
for(int i=xx;i>0;i-=lowbit(i)){
s+=c[i];
}
return s;
}
void pushdown(int p,int l,int r){
if(add[p]==0){
return;
}
int mid=l+r>>1;
sum[p*2]+=(mid-l+1)*add[p];
add[p*2]+=add[p];
sum[p*2+1]+=(r-mid)*add[p];
add[p*2+1]+=add[p];
add[p]=0;
return;
}
void build(int p,int l,int r){
add[p]=0;
if(l==r){
sum[p]=a[l];
return;
}
int mid=l+r>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
sum[p]=sum[p*2]+sum[p*2+1];
return;
}
void modify(int p,int l,int r,int x,int y,int v){
if(y<l||x>r){
return;
}
if(x<=l&&r<=y){
sum[p]+=(r-l+1)*v;
add[p]+=v;
return;
}
pushdown(p,l,r);
int mid=l+r>>1;
modify(p*2,l,mid,x,y,v);
modify(p*2+1,mid+1,r,x,y,v);
sum[p]=sum[p*2]+sum[p*2+1];
return;
}
int query(int p,int l,int r,int x,int y){
if(y<l||x>r){
return 0;
}
if(x<=l&&r<=y){
return sum[p];
}
pushdown(p,l,r);
int mid=l+r>>1;
int s=0;
s+=query(p*2,l,mid,x,y);
s+=query(p*2+1,mid+1,r,x,y);
return s;
}
signed main(){
n=read(),q=read(),k=read();
for(int i=1;i<=n;++i){
a[i]=read();
}
build(1,1,n);
for(int i=1;i<=q;++i){
x[i]=read(),y[i]=read(),z[i]=read();
}
for(int i=1;i<=k;++i){
e=read(),d=read();
addd(e,1);
addd(d+1,-1);
}
for(int i=1;i<=q;++i){
int t=summ(i);
if(t!=0){
modify(1,1,n,x[i],y[i],z[i]*summ(i));
}
}
for(int i=1;i<=n;++i){
printf("%lld ",query(1,1,n,i,i));
}
return 0;
}