http://codeforces.com/contest/295/problem/A
对于一个数组 如果是对某一连续的区间进行加上某个数 或者以等差数列的形式进行加数
都可以对此区间进行一定的标记 最后遍历一边就可以出结果
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#define LL long long
using namespace std;
const int N=110000;
const LL MOD = 1000000007;
LL a[N],b[N];
int l[N],r[N];
LL value[N],num[N];
int main()
{
//freopen("data.in","r",stdin);
int n,m,k;
while(cin>>n>>m>>k)
{
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=1;i<=m;++i)
cin>>l[i]>>r[i]>>value[i];
memset(num,0,sizeof(num));
while(k--)
{
int L,R;
cin>>L>>R;
++num[L];
--num[R+1];
}
memset(b,0,sizeof(b));
for(int i=1;i<=m;++i)
{
num[i]+=num[i-1];
b[l[i]]+=(value[i]*num[i]);
b[r[i]+1]-=(value[i]*num[i]);
}
//for(int i=1;i<=m;++i)
//cout<<b[i]<<" ";cout<<endl;
for(int i=1;i<=n;++i)
{
b[i]+=b[i-1];
cout<<(a[i]+b[i])<<" ";
}
cout<<endl;
}
return 0;
}
浙公网安备 33010602011771号